如果子類中定義了與父類同名的構造方法,會發生什么情況?
在這種情況下,如果想要在子類構造方法中調用父類的構造方法,就必須使用 super 關鍵字來調用父類的構造方法,而不能直接調用同名的父類構造方法。例如:
class Animal {? ? private String name;? ? public Animal(String name) {? ? ? ? this.name = name;}? ? public String getName() {? ? ? ? return name;}}class Dog extends Animal {? ? private int age;? ? public Dog(String name, int age) {? ? ? ? super(name); // 調用父類的構造方法? ? ? ? this.age = age;}? ? public Dog(String name) {? ? ? ? super(name); // 調用父類的構造方法? ? ? ? this.age = 0;}? ? public void printInfo() {? ? ? ? System.out.println("名字:" + super.getName() + ",年齡:" + age);}}public class Test {? ? public static void main(String[] args) {? ? ? ? Dog dog1 = new Dog("旺財", 3);dog1.printInfo();? ? ? ? Dog dog2 = new Dog("小黃");dog2.printInfo();? ? }}
在這個示例中,Animal類中定義了一個有參構造方法用于初始化name屬性,而Dog類中定義了兩個構造方法,一個是有參構造方法,另一個是無參構造方法。當創建Dog對象時,可以根據需要選擇調用哪個構造方法。在有參構造方法中,使用 super 關鍵字調用父類的構造方法來初始化父類的屬性name。在無參構造方法中,也使用 super 關鍵字調用父類的構造方法,并將age屬性初始化為0。在main()方法中,創建兩個Dog對象分別調用這些對象的printInfo()方法,輸出名字和年齡。
需要注意的是,如果在子類的構造方法中顯式地調用了父類的構造方法,那么調用父類的構造方法必須是子類構造方法的第一條語句。這是因為在執行子類構造方法之前,需要先執行父類的構造方法來初始化父類的屬性。如果在子類構造方法的第一條語句之后調用了父類的構造方法,就會導致父類的屬性沒有被正確地初始化,從而導致運行時錯誤。