偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java運(yùn)行時(shí)多態(tài)性:繼承和接口的實(shí)現(xiàn)

開發(fā) 后端
本文介紹Java做為一個(gè)面向?qū)ο笳Z言的最強(qiáng)大機(jī)制:運(yùn)行時(shí)多態(tài)性。兩個(gè)實(shí)現(xiàn)方式分別是集成和接口。

Java是面向?qū)ο蟮恼Z言,而運(yùn)行時(shí)多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)代碼重用的一個(gè)***大機(jī)制,動(dòng)態(tài)性的概念也可以被說成“一個(gè)接口,多個(gè)方法”。Java實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性的基礎(chǔ)是動(dòng)態(tài)方法調(diào)度,它是一種在運(yùn)行時(shí)而不是在編譯期調(diào)用重載方法的機(jī)制,下面就繼承和接口實(shí)現(xiàn)兩方面談?wù)刯ava運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)。

一、通過繼承中超類對(duì)象引用變量引用子類對(duì)象來實(shí)現(xiàn)

舉例說明:

  1. //定義超類superA  
  2. class superA  
  3. {  
  4. int i = 100;  
  5. void fun()  
  6. {  
  7. System.out.println(“This is superA”);  
  8. }  
  9. }  
  10. //定義superA的子類subB  
  11. class subB extends superA  
  12. {  
  13. int m = 1;  
  14. void fun()  
  15. {      
  16. System.out.println(“This is subB”);  
  17. }  
  18. }  
  19. //定義superA的子類subC  
  20. class subC extends superA  
  21. {  
  22. int n = 1;  
  23. void fun()  
  24. {      
  25. System.out.println(“This is subC”);  
  26. }  
  27. }  
  28. class Test  
  29. {  
  30. public static void main(String[] args)  
  31. {  
  32. superA a;  
  33. subB  b = new subB();  
  34. subC  c = new subC();  
  35. a=b;  
  36. a.fun();  (1)  
  37. a=c;  
  38. a.fun();  (2)  
  39. }  
  40. }  
  41.  

運(yùn)行結(jié)果為:

This is subB

This is subC

上述代碼中subB和subC是超類superA的子類,我們?cè)陬怲est中聲明了3個(gè)引用變量a, b, c,通過將子類對(duì)象引用賦值給超類對(duì)象引用變量來實(shí)現(xiàn)動(dòng)態(tài)方法調(diào)用。也許有人會(huì)問:“為什么(1)和(2)不輸出:This is superA”。java 的這種機(jī)制遵循一個(gè)原則:當(dāng)超類對(duì)象引用變量引用子類對(duì)象時(shí),被引用對(duì)象的類型而不是引用變量的類型決定了調(diào)用誰的成員方法,但是這個(gè)被調(diào)用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。

所以,不要被上例中(1)和(2)所迷惑,雖然寫成a.fun(),但是由于(1)中的a被b賦值,指向了子類subB的一個(gè)實(shí)例,因而(1)所調(diào)用的fun()實(shí)際上是子類subB的成員方法fun(),它覆蓋了超類superA的成員方法fun();同樣(2)調(diào)用的是子類subC的成員方法fun()。

另外,如果子類繼承的超類是一個(gè)抽象類,雖然抽象類不能通過new操作符實(shí)例化,但是可以創(chuàng)建抽象類的對(duì)象引用指向子類對(duì)象,以實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性。具體的實(shí)現(xiàn)方法同上例。

不過,抽象類的子類必須覆蓋實(shí)現(xiàn)超類中的所有的抽象方法,否則子類必須被abstract修飾符修飾,當(dāng)然也就不能被實(shí)例化了。

二、通過接口類型變量引用實(shí)現(xiàn)接口的類的對(duì)象來實(shí)現(xiàn)

接口的靈活性就在于“規(guī)定一個(gè)類必須做什么,而不管你如何做”。我們可以定義一個(gè)接口類型的引用變量來引用實(shí)現(xiàn)接口的類的實(shí)例,當(dāng)這個(gè)引用調(diào)用方法時(shí),它會(huì)根據(jù)實(shí)際引用的類的實(shí)例來判斷具體調(diào)用哪個(gè)方法,這和上述的超類對(duì)象引用訪問子類對(duì)象的機(jī)制相似。

舉例說明:

  1. //定義接口InterA  
  2. interface InterA  
  3. {  
  4. void fun();  
  5. }  
  6. //實(shí)現(xiàn)接口InterA的類B  
  7. class B implements InterA  
  8. {  
  9. public void fun()  
  10. {      
  11. System.out.println(“This is B”);  
  12. }  
  13. }  
  14. //實(shí)現(xiàn)接口InterA的類C  
  15. class C implements InterA  
  16. {  
  17. public void fun()  
  18. {      
  19. System.out.println(“This is C”);  
  20. }  
  21. }  
  22. class Test  
  23. {  
  24. public static void main(String[] args)  
  25. {  
  26. InterA  a;  
  27. a= new B();  
  28. a.fun();   
  29. a = new C();   
  30. a.fun();   
  31. }  
  32. }  
  33.  

輸出結(jié)果為:

This is B

This is C

上例中類B和類C是實(shí)現(xiàn)接口InterA的兩個(gè)類,分別實(shí)現(xiàn)了接口的方法fun(),通過將類B和類C的實(shí)例賦給接口引用a而實(shí)現(xiàn)了方法在運(yùn)行時(shí)的動(dòng)態(tài)綁定,充分利用了“一個(gè)接口,多個(gè)方法”展示了Java的動(dòng)態(tài)多態(tài)性。

需要注意的一點(diǎn)是:Java在利用接口變量調(diào)用其實(shí)現(xiàn)類的對(duì)象的方法時(shí),該方法必須已經(jīng)在接口中被聲明,而且在接口的實(shí)現(xiàn)類中該實(shí)現(xiàn)方法的類型和參數(shù)必須與接口中所定義的精確匹配。

結(jié)束語:以上就是java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)方法,大家在編程過程中可以靈活運(yùn)用,但是在性能要求較高的代碼中不提倡運(yùn)用運(yùn)行時(shí)多態(tài),畢竟Java的運(yùn)行時(shí)動(dòng)態(tài)方法調(diào)用較之普通的方法調(diào)用的系統(tǒng)開銷是比較大的。

【編輯推薦】

  1. 通過應(yīng)用實(shí)例討論Java多態(tài)的實(shí)現(xiàn)
  2. OO世界中的核心概念 .NET中的多態(tài)
  3. 深入理解Java多態(tài)性
  4. 初學(xué)Java語言之多態(tài)初體驗(yàn)
  5. 對(duì)Java程序多態(tài)性支持的改進(jìn)
責(zé)任編輯:yangsai 來源: BlogJava
相關(guān)推薦

2010-01-28 16:16:32

C++多態(tài)性

2011-07-11 16:45:25

JAVA多態(tài)性

2011-07-11 16:35:28

Java

2009-06-19 14:10:42

Java多態(tài)性

2023-08-21 09:37:57

MySQL工具MariaDB

2023-08-29 08:20:35

Kubernete跨云容器

2024-12-10 08:00:00

C++CRTP函數(shù)

2009-11-23 19:33:12

PHP5多態(tài)性

2009-09-01 14:51:19

C#多態(tài)性

2023-10-20 09:51:00

編程開發(fā)

2021-10-22 00:09:16

Kubernetes容器接口

2015-07-20 15:44:46

Swift框架MJExtension反射

2022-10-08 00:00:00

V8channel對(duì)象

2011-03-08 09:40:26

Java多態(tài)性

2023-11-21 16:31:51

C++語言

2012-02-16 11:29:01

ibmdw

2024-03-21 09:15:58

JS運(yùn)行的JavaScrip

2009-08-28 16:48:50

C#多態(tài)性

2009-09-01 15:08:18

C#多態(tài)性

2017-01-19 20:28:44

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)