Java是一種面向?qū)ο蟮木幊陶Z言,它支持類的繼承,即一個類可以從另一個類繼承屬性和方法。繼承可以提高代碼的復(fù)用性和可擴展性,但也帶來了一些問題,比如構(gòu)造函數(shù)的繼承。
構(gòu)造函數(shù)是一種特殊的方法,它用于創(chuàng)建類的實例,并初始化類的屬性。構(gòu)造函數(shù)的名字必須和類名相同,而且沒有返回值。構(gòu)造函數(shù)可以有參數(shù),也可以沒有參數(shù),但不能被繼承。
那么,如果一個類繼承了另一個類,它的構(gòu)造函數(shù)會怎樣呢?答案是,子類必須顯式地調(diào)用父類的構(gòu)造函數(shù),否則會報錯。這是因為子類需要先初始化父類的屬性,然后再初始化自己的屬性。如果不調(diào)用父類的構(gòu)造函數(shù),父類的屬性就沒有被賦值,導(dǎo)致程序出錯。
子類調(diào)用父類的構(gòu)造函數(shù)有兩種方式:一種是使用super關(guān)鍵字,在子類的構(gòu)造函數(shù)中第一行寫上super();或者super(參數(shù));來調(diào)用父類的無參或有參構(gòu)造函數(shù)。另一種是使用this關(guān)鍵字,在子類的構(gòu)造函數(shù)中第一行寫上this(參數(shù));來調(diào)用子類自己的其他構(gòu)造函數(shù),而那個構(gòu)造函數(shù)再調(diào)用父類的構(gòu)造函數(shù)。
下面是一個簡單的例子:
//定義一個父類Person
class Person {
String name;
int age;
//定義一個無參構(gòu)造函數(shù)
Person() {
System.out.println("Person無參構(gòu)造函數(shù)被調(diào)用");
}
//定義一個有參構(gòu)造函數(shù)
Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Person有參構(gòu)造函數(shù)被調(diào)用");
}
}
//定義一個子類Student,繼承自Person
class Student extends Person {
String school;
//定義一個無參構(gòu)造函數(shù)
Student() {
super(); //調(diào)用父類的無參構(gòu)造函數(shù)
System.out.println("Student無參構(gòu)造函數(shù)被調(diào)用");
}
//定義一個有參構(gòu)造函數(shù)
Student(String name, int age, String school) {
this(name, age); //調(diào)用本類的另一個有參構(gòu)造函數(shù)
this.school = school;
System.out.println("Student有參構(gòu)造函數(shù)被調(diào)用");
}
//定義另一個有參構(gòu)造函數(shù)
Student(String name, int age) {
super(name, age); //調(diào)用父類的有參構(gòu)造函數(shù)
System.out.println("Student另一個有參構(gòu)造函數(shù)被調(diào)用");
}
}
//在主方法中創(chuàng)建子類對象并測試
public class Test {
public static void main(String[] args) {
Student s1 = new Student(); //創(chuàng)建一個無參對象
Student s2 = new Student("張三",18,"清華大學(xué)"); //創(chuàng)建一個有參對象
}
}
運行結(jié)果如下:
Person無參構(gòu)造函數(shù)被調(diào)用
Student無參構(gòu)造函數(shù)被調(diào)用
Person有參構(gòu)造函數(shù)被調(diào)用
Student另一個有參構(gòu)造函數(shù)被調(diào)用
Student有參構(gòu)造函數(shù)被調(diào)用
從結(jié)果可以看出,每次創(chuàng)建子類對象時,都會先調(diào)用父類的構(gòu)造函數(shù),然后再調(diào)用子類的構(gòu)造函數(shù)。這樣可以保證父類和子類的屬性都被正確地初始化。
總結(jié)一下,Java中的類在繼承時不會繼承父類的構(gòu)造函數(shù),但必須顯式地調(diào)用父類的構(gòu)造函數(shù)來初始化父類的屬性。子類可以使用super或this關(guān)鍵字來調(diào)用父類或本類的構(gòu)造函數(shù),但必須放在子類構(gòu)造函數(shù)的第一行。這樣可以實現(xiàn)類的繼承與構(gòu)造函數(shù)的協(xié)調(diào)。
java相關(guān)課程推薦:java相關(guān)課程