public ClassName {}
2、this 和 super 的區別。
3、每個類直接或間接是Object的子類,Object只有一個無參構造方法。
4、編譯器會在每個構造方法的第一行隱式添加父類的默認無參構造器,即添加super()。
新手容易犯的錯誤:
class Employee extends Object {
public Employee(int id) {
}
}
class Teacher extends Employee {
public Teacher() {
}
}
以上代碼會產生編譯錯誤:
Implicit super constructor Employee() is undefined. Must explicitly invoke another constructor
因爲父類定義了一個帶參數的構造器,因此編譯器不會添加默認無參構造方法,但是因爲在子類的構造器中沒有顯式調用父類的某個構造方法,因此編譯器會自動添加super()方法, 但是父類中不存在默認無參構造方法,因此會提示默認無參構造方法未定義錯誤。
修改後的代碼:
class Employee {
public Employee(int id) {
}
}
class Teacher extends Employee {
public Teacher() {
super(10);
}
}
這樣,在子類的構造器中顯式調用了父類的某個構造器,所以編譯器不會自動添加super()方法。
構造器的訪問修飾符:
一般可以用public,protected,default和private修飾,但是對於private,子類是無法調用該類構造器的。
多層次調用父類構造方法:
假設我們有這樣一個層次結構:
Object->Employee->Teacher->Professor
class Employee {
public Employee() {
System.out.println("Employee constructor called");
}
}
class Teacher extends Employee {
public Teacher() {
System.out.println("Teacher constructor called");
}
}
class Professor extends Teacher {
public Professor() {
System.out.println("Professor constructor called");
}
}
public class Test {
public static void main(String args[]) {
Employee p = new Professor();
}
}
打印結果:
Employee constructor called
Teacher constructor called
Professor constructor called
在創建Professor對象時(new Professor()),首先會找到該類的無參構造方法,然後首先調用super()方法,調用Teacher類的無參構造方法,接着再調用 Employee的無參構造方法,最後再調用Object的無參構造方法。最後再打印出信息。