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

深入理解Java多態(tài)性

開發(fā) 后端
本文帶您通過幾個類的示例和講解來理解Java多態(tài)性,Java多態(tài)性的概念也可以被說成“一個接口,多個方法”。

看過一些關于Java多態(tài)性的文章,參考了很多人的理解,加入了一些自己的看法,整理出來供大家參考,不一定完全正確,歡迎大家批評指正。

(一)相關類

  1. class A ...{  
  2.          public String show(D obj)...{  
  3.                 return ("A and D");  
  4.          }   
  5.          public String show(A obj)...{  
  6.                 return ("A and A");  
  7.          }   
  8. }   
  9. class B extends A...{  
  10.          public String show(B obj)...{  
  11.                 return ("B and B");  
  12.          }  
  13.          public String show(A obj)...{  
  14.                 return ("B and A");  
  15.          }   
  16. }  
  17. class C extends B...{}   
  18. class D extends B...{}  

(二)問題:以下輸出結果是什么?

  1. A a1 = new A();  
  2.         A a2 = new B();  
  3.         B b = new B();  
  4.         C c = new C();   
  5.         D d = new D();   
  6.         System.out.println(a1.show(b));   ①  
  7.         System.out.println(a1.show(c));   ②  
  8.         System.out.println(a1.show(d));   ③  
  9.         System.out.println(a2.show(b));   ④  
  10.         System.out.println(a2.show(c));   ⑤  
  11.         System.out.println(a2.show(d));   ⑥  
  12.         System.out.println(b.show(b));    ⑦  
  13.         System.out.println(b.show(c));    ⑧  
  14.         System.out.println(b.show(d));    ⑨     

(三)答案

①   A and A

②   A and A

③   A and D

④   B and A

⑤   B and A

⑥   A and D

⑦   B and B

⑧   B and B

⑨   A and D

(四)分析

①②③比較好理解,一般不會出錯。④⑤就有點糊涂了,為什么輸出的不是"B and B”呢???!先來回顧一下多態(tài)性。

運行時多態(tài)性是面向對象程序設計代碼重用的一個最強大機制,Java多態(tài)性的概念也可以被說成“一個接口,多個方法”。Java實現(xiàn)運行時多態(tài)性的基礎是動態(tài)方法調度,它是一種在運行時而不是在編譯期調用重載方法的機制。

方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫(Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個類中Java多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。 (但是如果強制把超類轉換成子類的話,就可以調用子類中新添加而超類沒有的方法了。)

好了,先溫習到這里,言歸正傳!實際上這里涉及方法調用的優(yōu)先問題 ,優(yōu)先級由高到低依次為:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。讓我們來看看它是怎么工作的。

比如④,a2.show(b),a2是一個引用變量,類型為A,則this為a2,b是B的一個實例,于是它到類A里面找show(B obj)方法,沒有找到,于是到A的super(超類)找,而A沒有超類,因此轉到第三優(yōu)先級this.show((super)O),this仍然是a2,這里O為B,(super)O即(super)B即A,因此它到類A里面找show(A obj)的方法,類A有這個方法,但是由于a2引用的是類B的一個對象,B覆蓋了A的show(A obj)方法,因此最終鎖定到類B的show(A obj),輸出為"B and A”。

再比如⑧,b.show(c),b是一個引用變量,類型為B,則this為b,c是C的一個實例,于是它到類B找show(C obj)方法,沒有找到,轉而到B的超類A里面找,A里面也沒有,因此也轉到第三優(yōu)先級this.show((super)O),this為b,O為C,(super)O即(super)C即B,因此它到B里面找show(B obj)方法,找到了,由于b引用的是類B的一個對象,因此直接鎖定到類B的show(B obj),輸出為"B and B”。

按照上面的方法,可以正確得到其他的結果。

問題還要繼續(xù),現(xiàn)在我們再來看上面的分析過程是怎么體現(xiàn)出藍色字體那句話的內涵的。它說:當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。還是拿a2.show(b)來說吧。

a2是一個引用變量,類型為A,它引用的是B的一個對象,因此這句話的意思是由B來決定調用的是哪個方法。因此應該調用B的show(B obj)從而輸出"B and B”才對。但是為什么跟前面的分析得到的結果不相符呢?!問題在于我們不要忽略了藍色字體的后半部分,那里特別指明:這個被調用的方法必須是在超類中定義過的,也就是被子類覆蓋的方法。B里面的show(B obj)在超類A中有定義嗎?沒有!那就更談不上被覆蓋了。實際上這句話隱藏了一條信息:它仍然是按照方法調用的優(yōu)先級來確定的。它在類A中找到了show(A obj),如果子類B沒有覆蓋show(A obj)方法,那么它就調用A的show(A obj)(由于B繼承A,雖然沒有覆蓋這個方法,但從超類A那里繼承了這個方法,從某種意義上說,還是由B確定調用的方法,只是方法是在A中實現(xiàn)而已);現(xiàn)在子類B覆蓋了show(A obj),因此它最終鎖定到B的show(A obj)。這就是那句話的意義所在,到這里,我們可以清晰的理解Java的多態(tài)性了。

 

【編輯推薦】

  1. 總結Java Web中幾個函數(shù)的作用
  2. 在Java應用程序中使用Jfreechart配置
  3. Java虛擬機內部構成淺析
  4. 淺談Java線程的生命周期
  5. 關于Java繼承的一些復習
責任編輯:佚名 來源: CSDN
相關推薦

2009-09-01 14:51:19

C#多態(tài)性

2011-03-08 09:40:26

Java多態(tài)性

2011-07-11 16:35:28

Java

2011-07-11 16:45:25

JAVA多態(tài)性

2009-11-09 17:40:33

WCF配置可靠性

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數(shù)據結構hash函數(shù)

2020-07-21 08:26:08

SpringSecurity過濾器

2023-10-20 09:51:00

編程開發(fā)

2011-06-30 11:04:05

JTS

2010-02-01 14:07:12

C++多態(tài)性

2023-10-19 11:12:15

Netty代碼

2021-02-17 11:25:33

前端JavaScriptthis

2009-09-25 09:14:35

Hibernate日志

2013-09-22 14:57:19

AtWood

2020-09-23 10:00:26

Redis數(shù)據庫命令

2019-06-25 10:32:19

UDP編程通信

2017-01-10 08:48:21

2024-02-21 21:14:20

編程語言開發(fā)Golang

2025-05-06 00:43:00

MySQL日志文件MIXED 3
點贊
收藏

51CTO技術棧公眾號