Java super關鍵字:繼承中的父類調用,必學

在Java中,當我們創建子類對象時,子類會繼承父類的所有非私有成員(成員變量和成員方法)。但有時候,我們需要明確地調用父類的構造方法、成員變量或成員方法,這時候super關鍵字就派上大用場了。super就像是子類與父類之間的“橋樑”,幫助我們在子類中訪問父類的成員。

一、super調用父類構造方法

子類構造方法在執行時,默認會先調用父類的無參構造方法(通過super()實現)。如果父類沒有無參構造方法,或者子類需要調用父類的有參構造方法,就必須顯式使用super(參數列表),並且super()super(參數)必須放在子類構造方法的第一行

示例:調用父類有參構造方法

// 父類:動物類
class Animal {
    String name;
    // 父類只有有參構造方法(無無參構造)
    public Animal(String name) {
        this.name = name;
        System.out.println("父類Animal的有參構造被調用,name=" + name);
    }
}

// 子類:狗類,繼承Animal
class Dog extends Animal {
    int age;

    // 子類構造方法,必須調用父類的有參構造
    public Dog(String name, int age) {
        super(name); // 顯式調用父類的有參構造,必須放在第一行!
        this.age = age;
        System.out.println("子類Dog的構造被調用,age=" + age);
    }

    public static void main(String[] args) {
        Dog dog = new Dog("旺財", 3);
    }
}

運行結果

父類Animal的有參構造被調用,name=旺財
子類Dog的構造被調用,age=3

關鍵點
- 如果父類沒有無參構造,子類必須用super(參數)顯式調用父類構造,否則編譯報錯。
- super()必須放在子類構造方法的第一行,否則會報錯。

二、super調用父類成員變量

當子類成員變量與父類成員變量同名時,直接訪問會默認訪問子類的變量。如果想訪問父類的同名變量,需要用super.變量名

示例:訪問父類成員變量

// 父類:人類
class Person {
    int score = 80; // 父類成員變量
}

// 子類:學生類,繼承Person
class Student extends Person {
    int score = 95; // 子類成員變量,與父類同名

    void printScores() {
        System.out.println("子類score:" + score); // 訪問子類變量
        System.out.println("父類score:" + super.score); // 訪問父類變量
    }

    public static void main(String[] args) {
        Student stu = new Student();
        stu.printScores();
    }
}

運行結果

子類score:95
父類score:80

關鍵點
- super.變量名用於明確指定父類的成員變量,避免與子類同名變量衝突。

三、super調用父類成員方法

當子類重寫了父類的方法時,子類方法中默認調用的是子類自己的方法。如果想調用父類被重寫的方法,需要用super.方法名()

示例:調用父類被重寫的方法

// 父類:動物類
class Animal {
    void eat() {
        System.out.println("父類:動物在喫飯");
    }
}

// 子類:狗類,重寫父類的eat()方法
class Dog extends Animal {
    @Override
    void eat() {
        System.out.println("子類:狗在喫骨頭");
        super.eat(); // 調用父類被重寫的eat()方法
    }

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();
    }
}

運行結果

子類:狗在喫骨頭
父類:動物在喫飯

關鍵點
- super.方法名()用於在子類方法中調用父類的方法,即使子類重寫了該方法。

四、注意事項

  1. 不能在靜態方法中使用super
    靜態方法屬於類,而super是針對實例的,靜態方法中沒有“當前實例”的概念,因此無法使用super

  2. super()必須放在子類構造方法第一行
    否則會編譯報錯,因爲父類構造方法需要先初始化。

  3. superthis不能同時用在構造方法中
    this()super()都必須放在構造方法第一行,因此不能同時調用。

總結

super關鍵字在Java繼承中非常重要,主要用於:
- 調用父類構造方法(super()super(參數));
- 訪問父類同名成員變量(super.變量名);
- 調用父類被重寫的成員方法(super.方法名())。

掌握super能幫助你更清晰地控制子類與父類的成員關係,是理解Java繼承的必備技能!

小夜