我有這個問題涉及繼承,多態性,重載和覆蓋。我理解所有這些術語,但不確定它們在這里是如何工作的。代碼如下: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個贊
的聲明類型為 。a
A
A只有兩種方法:一個取A(b和c都是A的實例),另一個取D(b和c都不是D的實例)。
因此,第一種方法匹配,第二種方法不匹配。因此,編譯器選擇了第一種方法。
此方法在 B 中被覆蓋,并且的具體類型是 B,因此打印了“B 和 A”。a
該方法不會覆蓋該方法,因為它不采用與參數相同的類型。B.show(B)
A.show(A)

慕姐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)。
添加回答
舉報
0/150
提交
取消