1. 程式人生 > >Java中子類和父類之間的呼叫關係

Java中子類和父類之間的呼叫關係

在講之前,一些基本知識是應該具備的:

1.如果一個類中沒有定義構造器,編譯器在編譯時會自動加上預設無參構造器:

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的無參構造方法。最後再打印出資訊。