亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java - 當繼承,多態性,重載和重寫都涉及時調用哪個函數?

Java - 當繼承,多態性,重載和重寫都涉及時調用哪個函數?

九州編程 2022-08-17 16:49:05
我有這個問題涉及繼承,多態性,重載和覆蓋。我理解所有這些術語,但不確定它們在這里是如何工作的。代碼如下: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{}public class whatever {    public static void main(String[] args) {        A a = new B(); // note the B here        B b = new B();        C c = new C();        D d = new D();        System.out.println(a.show(a)); // B and A        System.out.println(a.show(b)); // B and A        System.out.println(a.show(c)); // B and A        System.out.println(a.show(d)); // A and D    }}所以這里的任務是找到輸出。我已經有了答案,這些是我提出的評論。我理解第一個,因為Java會自動進行動態綁定,所以a.show()從B類調用show(),a是A類型,所以B.show(A obj)被調用。最后一個也有意義,show()方法是重載的,并且由于d是D類型,因此調用A.show(D obj)是從A類繼承而來的。另外兩個我遇到了麻煩。好吧,我知道這是有道理的,因為b和c在技術上都是A類型的對象,但是為什么它與“B和A”而不是“B和B”一起使用?
查看完整描述

2 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

的聲明類型為 。aA

A只有兩種方法:一個取A(b和c都是A的實例),另一個取D(b和c都不是D的實例)。

因此,第一種方法匹配,第二種方法不匹配。因此,編譯器選擇了第一種方法。

此方法在 B 中被覆蓋,并且的具體類型是 B,因此打印了“B 和 A”。a

該方法不會覆蓋該方法,因為它不采用與參數相同的類型。B.show(B)A.show(A)


查看完整回答
反對 回復 2022-08-17
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

這里有兩個概念,一個是重載,另一個是重寫。當您創建 A a = new B() 時;它意味著 a 是 B 的對象,并且具有 A 的類型。因此,當執行a.show(a)時,它首先遇到類A的show(A obj)和show(B obj)方法,然后將參數與A類型匹配,但'a'是B的實例,因此執行B類的方法show(A obj)。

現在,當執行 a.show(c) 時,它首先遇到類 A 的 show(A obj) 和 show(B obj) 方法,然后找不到與類 A 中的 C 類型參數的任何匹配項,但它仍然被執行,因為類 C 擴展 B,B 擴展 A。

簡而言之,我們可以說a.show(a)等價于a.show(b),等價于a.show(c)。


查看完整回答
反對 回復 2022-08-17
  • 2 回答
  • 0 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號