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

Java 繼承實戰:從語法到 Pet/Dog 代碼演示,構造器鏈與多態調用全過程

     編輯:Java 綜合教學

前言:用最經典的「寵物-狗」模型講透繼承

繼承 = extends + 構造器鏈 + 方法復用 + 多態調用。本文通過 Pet (父類) → Dog (子類) 完整代碼,演示構造器調用順序、字段初始化、方法繼承調用、向上轉型賦值,助你從語法走向實戰。

一、父類 Pet:封裝通用屬性與行為

public class Pet {
    private String name = "無名氏";
    private int health = 100;
    private int love = 0;

    // 無參構造器
    public Pet() {
        this.health = 95;
        System.out.println("執行寵物的無參構造方法");
    }

    // 有參構造器
    public Pet(String name) {
        this.name = name;
    }

    // Getter
    public String getName() { return name; }
    public int getHealth() { return health; }
    public int getLove() { return love; }

    // 通用行為
    public void print() {
        System.out.println("寵物的自白:\n我的名字叫" + this.name 
            + ",我的健康值是" + this.health 
            + ",我和主人的親密程度是" + this.love + "。");
    }
}

二、子類 Dog:擴展品種屬性,復用父類邏輯

public class Dog extends Pet {
    private String strain; // 品種,子類特有

    // 有參構造器:必須顯式調用 super(name) 初始化父類字段
    public Dog(String name, String strain) {
        super(name);        // ★ 關鍵:調用父類有參構造器
        this.strain = strain;
    }

    public String getStrain() { return strain; }
    // 繼承了 Pet 的 print()、getName()、getHealth()、getLove()
}

三、測試類:見證繼承威力

public class TestInheritance {
    public static void main(String[] args) {
        // 1. 創建父類對象
        Pet pet = new Pet("貝貝");
        pet.print();
        // 輸出: 寵物的自白:我的名字叫貝貝,我的健康值是95,我和主人的親密程度是0。

        System.out.println("-------------------");

        // 2. 創建子類對象
        Dog dog = new Dog("歐歐", "雪納瑞");
        dog.print(); // ★ 直接調用父類方法!
        // 輸出: 寵物的自白:我的名字叫歐歐,我的健康值是95,我和主人的親密程度是0。

        // 3. 向上轉型:父類引用指向子類對象
        Pet petRef = new Dog("大黃", "拉布拉多");
        petRef.print(); // 動態綁定:調用 Dog 繼承的 print()
        // petRef.getStrain(); // 編譯錯誤:父類引用不可訪問子類特有方法
    }
}

四、核心知識點圖解

1. 構造器調用鏈

new Dog("歐歐", "雪納瑞")
    │
    ├─ Dog(String, String) 構造器
    │    ├─ super("歐歐")  →  Pet(String) 構造器執行
    │    │    ├─ this.name = "歐歐"
    │    │    └─ 返回
    │    └─ this.strain = "雪納瑞"
    └─ Dog 對象創建完成
    { name="歐歐", health=95, love=0, strain="雪納瑞" }

2. 內存佈局

┌─────────────────────────────────────┐
│           Dog Object (堆)            │
├─────────────────────────────────────┤
│ Pet 部分 (繼承得來)                  │
│  - name: "歐歐"       ← private      │
│  - health: 95         ← private      │
│  - love: 0            ← private      │
├─────────────────────────────────────┤
│ Dog 部分 (自有)                      │
│  - strain: "雪納瑞"  ← private       │
└─────────────────────────────────────┘
子類對象 = 父類字段 + 子類字段 (連續內存)
private 字段子類不可直接訪問,只能通過父類 public/protected 方法

3. 向上轉型與多態

Pet petRef = new Dog("大黃", "拉布拉多");
    │
    ├─ 編譯類型: Pet  → 只能調用 Pet 定義的方法
    ├─ 運行類型: Dog  → 實際執行 Dog 繼承/重寫的方法
    └─ petRef.print() → 動態綁定 → 執行 Pet.print() (Dog 未重寫)

五、常見錯誤與修正

錯誤代碼問題修正
super.name = name; 在子類構造器中private 字段不可見調用 super(name) 讓父類初始化
子類構造器未調用 super()父類無無參構造器時報錯顯式調用帶參 super(...)
petRef.getStrain()父類引用不可訪問子類方法向下轉型 ((Dog)petRef).getStrain() (需 instanceof 守衛)
子類定義同名 private 方法不構成重寫,父類方法被隱藏重寫方法權限 ≥ 父類,通常 public/protected

六、總結

  1. extends 建立繼承,子類獲得父類非 private 成員。
  2. 子類構造器 首行必須調用 super(...) 初始化父類狀態。
  3. 父類引用指向子類對象 (向上轉型) 是多態基石,編譯看父類,運行看子類。
  4. private 字段/方法封裝在父類,子類通過公共 API 間接訪問。
  5. 實戰中:父類抽象通用屬性/行為,子類擴展特有屬性/重寫特有行為。

設計原則:繼承表達「is-a」關係,Dog is a Pet 成立才用繼承。若只是為復用代碼,請用組合。

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