日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java多态调用优先级_关于java的多态方法调用顺序的问题

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多态调用优先级_关于java的多态方法调用顺序的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用父類類型的引用指向子類的對象,該引用調用的師父類中定義的方法和變量,變量不能被重寫(覆蓋);如果子類中重寫了父類中的一個方法,那么在調用這個方法的時候,將會調用子類中的這個方法;

注意特殊情況,如果該父類引用所調用的方法參數列表未定義,就調用該父類的父類中查找,如果還沒找到就強制向上類型轉換參數列表中的參數類型,具體優先級高到低依次如下:

this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

class?A?{

public?String?show(D?obj)...{

return?("A?and?D");

}

public?String?show(A?obj)...{

return?("A?and?A");

}

}

class?B?extends?A{

public?String?show(B?obj)...{

return?("B?and?B");

}

public?String?show(A?obj)...{

return?("B?and?A");

}

}

class?C?extends?B...{}

class?D?extends?B...{}

A?a1?=?new?A();

A?a2?=?new?B();

B?b?=?new?B();

C?c?=?new?C();

D?d?=?new?D();

System.out.println(a1.show(b));???①

System.out.println(a1.show(c));???②

System.out.println(a1.show(d));???③

System.out.println(a2.show(b));???④

System.out.println(a2.show(c));???⑤

System.out.println(a2.show(d));???⑥

System.out.println(b.show(b));?????⑦

System.out.println(b.show(c));?????⑧

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”呢?!!先來回顧一下多態性。

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

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

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

好了,先溫習到這里,言歸正傳!實際上這里涉及方法調用的優先問題?,優先級由高到低依次為: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沒有超類,因此轉到第三優先級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里面也沒有,因此也轉到第三優先級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”。

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

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

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

總結

以上是生活随笔為你收集整理的java多态调用优先级_关于java的多态方法调用顺序的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。