App下載

Java類的繼承與構造函數:你需要知道的一切

勇敢的小蘿卜 2023-06-27 11:40:37 瀏覽數 (1966)
反饋

Java是一種面向對象的編程語言,它支持類的繼承,即一個類可以從另一個類繼承屬性和方法。繼承可以提高代碼的復用性和可擴展性,但也帶來了一些問題,比如構造函數的繼承。

構造函數是一種特殊的方法,它用于創(chuàng)建類的實例,并初始化類的屬性。構造函數的名字必須和類名相同,而且沒有返回值。構造函數可以有參數,也可以沒有參數,但不能被繼承。

那么,如果一個類繼承了另一個類,它的構造函數會怎樣呢?答案是,子類必須顯式地調用父類的構造函數,否則會報錯。這是因為子類需要先初始化父類的屬性,然后再初始化自己的屬性。如果不調用父類的構造函數,父類的屬性就沒有被賦值,導致程序出錯。

子類調用父類的構造函數有兩種方式:一種是使用super關鍵字,在子類的構造函數中第一行寫上super();或者super(參數);來調用父類的無參或有參構造函數。另一種是使用this關鍵字,在子類的構造函數中第一行寫上this(參數);來調用子類自己的其他構造函數,而那個構造函數再調用父類的構造函數。

下面是一個簡單的例子:

//定義一個父類Person
class Person {
  String name;
  int age;
  //定義一個無參構造函數
  Person() {
    System.out.println("Person無參構造函數被調用");
  }
  //定義一個有參構造函數
  Person(String name, int age) {
    this.name = name;
    this.age = age;
    System.out.println("Person有參構造函數被調用");
  }
}
//定義一個子類Student,繼承自Person
class Student extends Person {
  String school;
  //定義一個無參構造函數
  Student() {
    super(); //調用父類的無參構造函數
    System.out.println("Student無參構造函數被調用");
  }
  //定義一個有參構造函數
  Student(String name, int age, String school) {
    this(name, age); //調用本類的另一個有參構造函數
    this.school = school;
    System.out.println("Student有參構造函數被調用");
  }
  //定義另一個有參構造函數
  Student(String name, int age) {
    super(name, age); //調用父類的有參構造函數
    System.out.println("Student另一個有參構造函數被調用");
  }
}
//在主方法中創(chuàng)建子類對象并測試
public class Test {
  public static void main(String[] args) {
    Student s1 = new Student(); //創(chuàng)建一個無參對象
    Student s2 = new Student("張三",18,"清華大學"); //創(chuàng)建一個有參對象
  }
}

運行結果如下:

Person無參構造函數被調用
Student無參構造函數被調用
Person有參構造函數被調用
Student另一個有參構造函數被調用
Student有參構造函數被調用

從結果可以看出,每次創(chuàng)建子類對象時,都會先調用父類的構造函數,然后再調用子類的構造函數。這樣可以保證父類和子類的屬性都被正確地初始化。

總結一下,Java中的類在繼承時不會繼承父類的構造函數,但必須顯式地調用父類的構造函數來初始化父類的屬性。子類可以使用super或this關鍵字來調用父類或本類的構造函數,但必須放在子類構造函數的第一行。這樣可以實現類的繼承與構造函數的協(xié)調。

java相關課程推薦:java相關課程

0 人點贊