首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 面向對象核心機制(一):封裝優勢、繼承與組合關係、方法重載重寫規則、變量遮蔽與動態分派原理

     編輯:Java 相關知識

封裝的三大優勢

  • 隱藏數據,僅通過公共接口訪問
  • 接口與實現分離,修改內部代碼不破壞調用者
  • 與繼承、多態並列為 OOP 三大特性

關係實現

  • is-a (繼承):extends 關鍵字
  • has-a (組合):成員變量持有引用

重載 vs 重寫 對比

變量遮蔽 (Shadowing/Hiding)

  • 成員變量可被子類同名變量遮蔽
  • 變量引用編譯期靜態綁定:父類引用指向子類對象,訪問變量仍取父類值
  • 方法調用運行期動態綁定:同樣情況調用方法執行子類實現
class S1 { String s = "S1"; String getS() { return s; } }
class S2 extends S1 { String s = "S2"; String getS() { return s; } }

S1 s1 = new S2();
System.out.println(s1.s);     // "S1" (變量靜態綁定)
System.out.println(s1.getS()); // "S2" (方法動態分派)

動態方法查找與 super 限制

  • JVM 根據對象實際類型分派方法 (虛方法調用/晚綁定)
  • 對象內部標記真實類型,支持 instanceof
  • super.method() 僅能訪問直接父類實現,super.super 非法
  • 通過 ((GrandParent)this).method() 強制轉型也無法訪問祖父類方法 (仍按實際類型分派)
  • 但變量可通過強制轉型訪問祖先層級:((GrandParent)this).field

私有方法與多態

  • 私有方法不被繼承,子類同簽名方法是獨立新方法
  • 私有方法調用編譯期靜態綁定,不參與動態分派
class A { private int f() { return 0; } public int g() { return 3; } }
class B extends A { private int f() { return 1; } public int g() { return f(); } }
class C extends B { public int f() { return 2; } }

A ref = new C();
System.out.println(((B)ref).g()); // 輸出 1 (B.g() 調用 B.f(),私有方法靜態綁定)
// 若 B.f() 非 private,輸出 2 (C.f() 覆蓋)

抽象類與構造器

  • 包含抽象方法的類必須聲明 abstract,不可實例化
  • 非抽象父類的方法可在子類中聲明為 abstract (使子類成為抽象類)
  • 子類可聲明 abstract 無論父類是否抽象

掌握這些核心機制,是設計健壯、可擴展 Java 系統的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度重載重寫
簽名必須不同 (參數列表),返回類型可同可不同必須完全相同 (含返回類型)
訪問權限任意不能比被重寫方法更私有
拋出異常任意不能拋出更多受檢異常,可拋出更少或無
綁定時機編譯期 (靜態綁定)運行期 (動態分派)
方法關係獨立方法,名字巧合子類覆蓋父類實現
相互調用通過參數列表區分直接調用super.method() 調用父類實現,僅限直接父類
static 參與可重載 static/non-static,但同簽名一 static 一 non-static 編譯錯誤static 不參與重寫 (編譯期綁定),不能將 static 改為 non-static 或反過來
數量限制無上限每個父類方法在子類中最多重寫一次