構造方法
在繼承關係下構造方法執行時的順序:先執行父類構造方法,在執行子類構造方法
// 創建Animal兩類
class Animal {
public Animal(){
System.out.println("Animal執行構造方法");
}
public void eat(){
System.out.println("Animal執行eat方法");
}
}
// Cat繼承Animal類
class Cat extends Animal{
//Cat類的構造方法
public Cat(){
System.out.println("Cat執行構造方法");
}
// 繼承父類方法進行了重新
@Override
public void eat(){
System.out.println("Cat執行eat方法");
}
}
// Tomcat繼承Cat類
class Tomcat extends Cat{
public Tomcat(){
System.out.println("Tomcat執行構造方法");
}
public void eat() {
//System.out.println("Tomcat執行eat方法");
super.eat();
}
}
// 測試
public class ExtendsTest {
public static void main(String[] args) {
Cat cat = new Cat();
Animal animal = new Cat();
Animal animal2 = new Tomcat();
Cat cat2 = new Tomcat();
animal.eat();
animal2.eat();
}
}
運行結果:
/*
Cat執行構造方法
Animal執行構造方法
Cat執行構造方法
Tomcat執行構造方法
Animal執行構造方法
Cat執行構造方法
Tomcat執行構造方法
Cat執行eat方法
Cat執行eat方法
*/
解析:
Cat cat = new Cat();實例化對象調用Animal父類構造方法再調用Cat子類構造方法;
Animal animal = new Cat(); 對象animal引用的是Cat()實例化對象,同理先調用Animal父類構造方法再調用Cat子類構造方法;
Animal animal2 = new Tomcat(); 對象animal2引用的是Tomcat()實例化對象,同理先父類再子類,Tomcat的父類爲Cat,而Cat的父類是Animal,所以先執行Animal的構造方法,再執行Cat的構造方法,然後才執行Tomcat的構造方法;
Cat cat2 = new Tomcat();同理,構造方法執行順序和左邊創建的對象類型無關。
在繼承關係中,子類中和父類同名的方法會被子類方法覆蓋,如果想要調用父類的方法的話要使用super關鍵字。
**注意:**如果父類中存在有參數的構造方法,系統將不會自動生成默認的無參數構造方法,這時候需要手動創建,要不然在繼承過程中,子類實例化調用自身無參構造方法時,而父類卻沒有,這將會導致錯誤。