首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 多態與方法重載解析:a2.show(b) 輸出 "b and a" 原理

     編輯:程式設計疑難解答

程式碼結構

class A { String show(D obj) { return "a and d"; }
          String show(A obj) { return "a and a"; } }
class B extends A { String show(A obj) { return "b and a"; }
                    String show(B obj) { return "b and b"; } }
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();

關鍵概念:靜態綁定 vs 動態綁定

  • 重載:編譯期根據參考型別與參數靜態型別決定調用哪個方法(靜態綁定)。
  • 覆寫:執行期根據物件實際型別決定調用哪個方法(動態綁定)。

逐行分析

呼叫參考型別參數靜態型別選擇方法(編譯期)實際執行(執行期)輸出
a1.show(b)ABA.show(A) — B 是 A 的子類B 覆寫了 show(A)b and a
a1.show(c)ACA.show(A) — C 是 A 的子類B 覆寫了 show(A)b and a
a1.show(d)ADA.show(D) — 精確匹配A.show(D) 未被覆寫a and d
a2.show(b)ABA.show(A) — a2 型別為 Aa2 實為 B,B 覆寫 show(A)b and a
a2.show(c)ACA.show(A)B 覆寫 show(A)b and a
a2.show(d)ADA.show(D)A.show(D) 未被覆寫a and d
b.show(b)BBB.show(B)B.show(B)b and b
b.show(c)BCB.show(B) — C 是 B 子類B.show(B)b and a
b.show(d)BDB.show(B) — D 是 B 子類B.show(B)b and a

核心口訣

  1. 看參考型別決定「有哪些重載候選」(編譯期)。
  2. 看參數靜態型別選「最匹配的重載」(編譯期)。
  3. 若該方法被覆寫,執行期看物件實際型別調用覆寫版(動態綁定)。

總結

a2 編譯型別為 A,故只能看到 A 的重載集合。參數 b 型別為 B,匹配 A.show(A)。執行期 a2 實為 B,B 覆寫了 show(A),故輸出 b and a。理解「重載靜態、覆寫動態」是掌握 Java 多態的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved