Java super關鍵字


java中的super關鍵字是一個參照變數,用於參照直接父類別物件。

每當建立子類的範例時,父類別的範例被隱式建立,由super關鍵字參照變數參照。

java super關鍵字的用法如下:

  • super可以用來參照直接父類別的範例變數。
  • super可以用來呼叫直接父類別方法。
  • super()可以用於呼叫直接父類別建構函式。

1. super用於參照直接父類別範例變數

可以使用super關鍵字來存取父類別的資料成員或欄位。 如果父類別和子類具有相同的欄位,則使用super來指定為父類別資料成員或欄位。

class Animal {
    String color = "white";
}

class Dog extends Animal {
    String color = "black";

    void printColor() {
        System.out.println(color);// prints color of Dog class
        System.out.println(super.color);// prints color of Animal class
    }
}

class TestSuper1 {
    public static void main(String args[]) {
        Dog d = new Dog();
        d.printColor();
    }
}

執行上面程式碼,輸出結果如下 -

black
white

在上面的例子中,AnimalDog都有一個共同的屬性:color。 如果我們列印color屬性,它將預設列印當前類的顏色。 要存取父屬性,需要使用super關鍵字指定。

2. 通過 super 來呼叫父類別方法

super關鍵字也可以用於呼叫父類別方法。 如果子類包含與父類別相同的方法,則應使用super關鍵字指定父類別的方法。 換句話說,如果方法被覆蓋就可以使用 super 關鍵字來指定父類別方法。

class Animal {
    void eat() {
        System.out.println("eating...");
    }
}

class Dog extends Animal {
    void eat() {
        System.out.println("eating bread...");
    }

    void bark() {
        System.out.println("barking...");
    }

    void work() {
        super.eat();
        bark();
    }
}

class TestSuper2 {
    public static void main(String args[]) {
        Dog d = new Dog();
        d.work();
    }
}

執行上面程式碼,輸出結果如下 -

eating...
barking...

在上面的例子中,AnimalDog兩個類都有eat()方法,如果要呼叫Dog類中的eat()方法,它將預設呼叫Dog類的eat()方法,因為當前類的優先順序比父類別的高。
所以要呼叫父類別方法,需要使用super關鍵字指定。

3. 使用 super 來呼叫父類別建構函式

super關鍵字也可以用於呼叫父類別建構函式。下面來看一個簡單的例子:

class Animal {
    Animal() {
        System.out.println("animal is created");
    }
}

class Dog extends Animal {
    Dog() {
        super();
        System.out.println("dog is created");
    }
}

class TestSuper3 {
    public static void main(String args[]) {
        Dog d = new Dog();
    }
}

注意:如果沒有使用super()this(),則super()在每個類建構函式中由編譯器自動新增。

我們知道,如果沒有建構函式,編譯器會自動提供預設建構函式。 但是,它還新增了super()作為第一個語句。

下面是super關鍵字的另一個例子,這裡super()由編譯器隱式提供。

class Animal {
    Animal() {
        System.out.println("animal is created");
    }
}

class Dog extends Animal {
    Dog() {
        System.out.println("dog is created");
    }
}

class TestSuper4 {
    public static void main(String args[]) {
        Dog d = new Dog();
    }
}

執行上面程式碼,輸出結果如下 -

animal is created
dog is created

super實際使用範例

下面來看看super關鍵字的實際用法。 在這裡,Emp類繼承了Person類,所以Person的所有屬性都將預設繼承到Emp。 要初始化所有的屬性,可使用子類的父類別建構函式。 這樣,我們重用了父類別的建構函式。

class Person {
    int id;
    String name;

    Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

class Emp extends Person {
    float salary;

    Emp(int id, String name, float salary) {
        super(id, name);// reusing parent constructor
        this.salary = salary;
    }

    void display() {
        System.out.println(id + " " + name + " " + salary);
    }
}

class TestSuper5 {
    public static void main(String[] args) {
        Emp e1 = new Emp(1, "ankit", 45000f);
        e1.display();
    }
}

執行上面程式碼,輸出結果如下 -

1 ankit 45000