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

Java 繼承機制全解析:從語法規則到對象初始化順序

     編輯:Java 綜合教學

繼承核心概念與語法

繼承(Inheritance)建立類之間的 is-a 關係,子類自動擁有父類非私有成員,實現代碼復用。Java 採用單繼承模型:一個類僅能有一個直接父類(默認繼承 Object)。

class Animal { /* 父類 */ }
class Dog extends Animal { /* 子類 */ } // 語法:class 子類 extends 父類

Eclipse/IDEA 新建類時可直接指定 Superclass,IDE 自動生成 extends 子句與構造器調用 super()。

方法重寫(Override)規則

子類重寫父類方法需滿足「兩同兩小一大」:

  • 方法名、參數列表相同(簽名一致)
  • 返回類型相同或為子類型(協變返回,JDK 5+)
  • 拋出異常範圍相同或更小
  • 訪問權限相同或更大(不能縮小可見性)

@Override 註解編譯期校驗,防止誤寫成重載。私有方法、靜態方法、final 方法、構造器均不可重寫。

對象初始化順序鐵律

  1. 父類靜態成員/靜態塊(按聲明順序)
  2. 子類靜態成員/靜態塊
  3. 父類實例成員/實例塊
  4. 父類構造器
  5. 子類實例成員/實例塊
  6. 子類構造器

關鍵點:子類構造器首行隱式/顯式調用 super(...);若父類無無參構造器,子類必須顯式調用帶參 super(...),否則編譯錯誤。

class Animal {
    { System.out.println("Animal 實例塊"); }
    Animal() { System.out.println("Animal 無參構造"); }
    Animal(String name) { System.out.println("Animal 帶參構造: " + name); }
}
class Dog extends Animal {
    { System.out.println("Dog 實例塊"); }
    Dog() { super("旺財"); System.out.println("Dog 無參構造"); }
}
// 輸出順序:Animal實例塊 → Animal帶參構造 → Dog實例塊 → Dog無參構造

final 關鍵字四大用法

修飾目標語義典型場景
類不可被繼承String、Integer、工具類
方法不可被重寫模板方法模式骨架、安全敏感操作
屬性(字段)引用不可變(對象內部狀態仍可變)常量 static final、依賴注入字段
局部變量/參數只能賦值一次,變為常量匿名內部類捕獲變量、方法參數保護

final 字段必須在聲明時、實例塊或構造器中初始化(二擇一),且僅初始化一次。

super 關鍵字三大用途

  1. 訪問父類被隱藏字段:super.field
  2. 調用父類被重寫方法:super.method()
  3. 調用父類構造器:super(args) 必須置於子類構造器首行
class Dog extends Animal {
    String name = "Dog";
    void printName() {
        System.out.println(this.name); // Dog
        System.out.println(super.name); // Animal
    }
    Dog(String name) {
        super(name); // 必須首行
        this.name = name;
    }
}

Object 類:所有類的終極父類

toString() 規約與重寫

默認返回 類名@哈希碼(如 Dog@15db9742)。建議所有實體類重寫,輸出業務關鍵字段,便於日誌診斷。IDE 提供 Source → Generate toString() 自動生成。

equals() 與 hashCode() 契約

  • 默認比較引用地址(同 ==)
  • 重寫 equals() 時必須重寫 hashCode(),保證「equal objects have equal hash codes」
  • IDE Generate hashCode() and equals() 基於選定字段生成標準實現
// 標準 equals 模板
@Override public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Dog dog = (Dog) o;
    return age == dog.age && Objects.equals(name, dog.name);
}
@Override public int hashCode() {
    return Objects.hash(name, age);
}

類對象 vs 類的對象

  • 類對象(Class Object):Dog.class、dog.getClass()、Class.forName("Dog") 獲取的 Class 實例,代表類元數據,JVM 每類僅一個
  • 類的對象(Instance):new Dog() 創建的實例,堆內存中可有多個

類對象與實例對象區別

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