super
關鍵字在 Java 中用于訪問父類的成員(包括字段、方法和構造函數)。當你在子類中調用父類的方法或訪問父類的成員變量時,super
是必不可少的工具。
🔑 super
的基本用法
1. 調用父類的構造方法
在子類的構造方法中,你可以通過 super()
來調用父類的構造方法。如果父類沒有默認的無參構造方法,你必須顯式地調用父類的構造方法。
class Parent {Parent() {System.out.println("父類構造方法");}
}class Child extends Parent {Child() {super(); // 顯式調用父類的構造方法System.out.println("子類構造方法");}
}public class Test {public static void main(String[] args) {new Child();}
}
輸出:
父類構造方法
子類構造方法
解釋:
-
super()
調用父類的構造方法。如果不寫super()
,Java 會隱式地調用父類的無參構造方法。 -
super
必須是子類構造函數中的第一行代碼。
2. 調用父類的方法
如果子類重寫了父類的方法,但你仍然想在子類中調用父類版本的方法,可以使用 super
來調用父類的方法。
class Parent {void show() {System.out.println("父類的 show()");}
}class Child extends Parent {@Overridevoid show() {super.show(); // 調用父類的 show() 方法System.out.println("子類的 show()");}
}public class Test {public static void main(String[] args) {Child c = new Child();c.show();}
}
輸出:
父類的 show()
子類的 show()
解釋:
-
super.show()
調用父類的show()
方法,子類在調用后自己繼續執行。
3. 訪問父類的字段
如果子類和父類有同名的字段,子類訪問時可以通過 super
來訪問父類的字段,避免與子類的字段混淆。
class Parent {String name = "父類的名稱";
}class Child extends Parent {String name = "子類的名稱";void display() {System.out.println("子類的字段: " + name);System.out.println("父類的字段: " + super.name); // 使用 super 訪問父類的字段}
}public class Test {public static void main(String[] args) {Child c = new Child();c.display();}
}
輸出:
子類的字段: 子類的名稱
父類的字段: 父類的名稱
解釋:
-
super.name
訪問的是父類的name
字段,而name
沒有super
的情況下則訪問子類的name
字段。
4. 調用父類的帶參構造方法
如果父類有帶參數的構造方法,你可以通過 super()
傳遞參數來調用父類的構造方法。
class Parent {Parent(String name) {System.out.println("父類的構造方法,name: " + name);}
}class Child extends Parent {Child(String name) {super(name); // 調用父類帶參構造方法System.out.println("子類的構造方法");}
}public class Test {public static void main(String[] args) {new Child("Tom");}
}
輸出:
父類的構造方法,name: Tom
子類的構造方法
解釋:
-
super(name)
通過傳遞參數name
來調用父類的帶參構造方法。
🧠 super
的應用場景總結
使用場景 | 描述 |
---|---|
調用父類構造方法 | super() 用于調用父類構造方法,可以調用無參或帶參的父類構造方法。 |
調用父類方法 | super.methodName() 用于調用父類的方法,尤其是子類重寫了父類的方法時。 |
訪問父類字段 | super.fieldName 用于訪問父類中定義的字段,避免與子類字段同名沖突。 |
🔥 super
的限制與注意事項
-
不能用于訪問父類的私有成員:
-
super
無法直接訪問父類的私有方法或私有字段。如果父類的成員是私有的,則只能通過公共的 getter/setter 方法訪問。
-
-
super
不能在靜態上下文中使用:-
super
是與實例(對象)相關的,而靜態方法與類相關,所以不能在靜態方法中使用super
。
-
-
super()
必須在構造方法的第一行:-
如果子類的構造方法需要調用父類構造方法,
super()
必須在構造方法的第一行,否則會編譯錯誤。
-
💡 示例:綜合應用
class Animal {String type;Animal(String type) {this.type = type;}void speak() {System.out.println("動物發出聲音");}
}class Dog extends Animal {String name;Dog(String type, String name) {super(type); // 調用父類的構造方法this.name = name;}@Overridevoid speak() {super.speak(); // 調用父類的 speak 方法System.out.println(name + " 叫:汪汪!");}
}public class Test {public static void main(String[] args) {Dog dog = new Dog("哺乳動物", "小狗");dog.speak();}
}
輸出:
動物發出聲音
小狗 叫:汪汪!
總結:
-
super
是 Java 中用于訪問父類成員的關鍵字,能夠幫助你調用父類的構造方法、方法、字段等。 -
你可以利用
super
來解決子類與父類同名方法、字段的沖突,并且能清晰地訪問父類的方法和屬性。