java中的super
關鍵字是一個參照變數,用於參照直接父類別物件。
每當建立子類的範例時,父類別的範例被隱式建立,由super
關鍵字參照變數參照。
java super
關鍵字的用法如下:
super
可以用來參照直接父類別的範例變數。super
可以用來呼叫直接父類別方法。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
在上面的例子中,Animal
和Dog
都有一個共同的屬性:color
。 如果我們列印color
屬性,它將預設列印當前類的顏色。 要存取父屬性,需要使用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...
在上面的例子中,Animal
和Dog
兩個類都有eat()
方法,如果要呼叫Dog
類中的eat()
方法,它將預設呼叫Dog
類的eat()
方法,因為當前類的優先順序比父類別的高。
所以要呼叫父類別方法,需要使用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
關鍵字的實際用法。 在這裡,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