Java的繼承初始化順序 當使用繼承這個特性時,程式是如何執行的; ...
Java的繼承初始化順序
當使用繼承這個特性時,程式是如何執行的;
繼承的初始化順序
1.初始化父類再初始子類
2.先執行初始化對象中屬性,再執行構造方法中的初始化
當使用繼承這個特性時,程式是如何執行的呢,也就是說我們需要關註繼承的初始化順序,當我們創造一個對象的時候,所執行的構造方法就相當於初始化一個對象,所以如果我們需要證明初始化一個對象的時候,它是不是會先初始化父類,然後初始化子類
初始化其實就相當於執行類的構造方法,所以我們只需要重寫構造方法,在類的構造方法中輸出一句話,看它到底是什麼時候輸出的,就知道他們的執行順序了
舉個例子:
Animal類:
package com.test; public class Animal { public int age; public String name; public void eat(){ System.out.println("動物是可以吃東西的"); //這裡的父類只是描述動物可以吃東西 } public Animal(){ System.out.println("Animal類執行了"); } }
Dog類:
package com.test; public class Dog extends Animal{ public Dog(){ System.out.println("Dog類執行了"); //我們在Dog類定義一個無參的構造方法 } }
主函數Initail類:
package com.test; public class InitailClass { public static void main(String[] args) { // TODO Auto-generated method stub Dog d = new Dog();//主函數里只是創建了子類對象 d.age = 10; d.name = "xiaotian"; d.eat(); } }
我們看一下它的執行順序:
運行結果為:
可以看出僅僅是創建了子類對象,但它是先執行了父類的構造方法,然後執行子類的構造方法.我們就能證明當我們創建對象的時候,它是優先創建父類對象,然後創建子類對象
如果對象中有屬性,屬性和我們的構造方法在初始化的時候哪一個先執行呢
例子如下:
Animal類:
package com.test; public class Animal { public int age=10;//為屬性賦初值 public String name; public void eat(){ System.out.println("動物是可以吃東西的"); //這裡的父類只是描述動物可以吃東西 } public Animal(){ System.out.println("Animal類執行了"); age = 20;//在執行構造方法的時候再為age賦一個值 //如果在程式中輸出這個值,這個值其實應該是後一個的值,因為後面賦的值會把前面的覆蓋掉 } }
主函數Initail類:
package com.test; public class InitailClass { public static void main(String[] args) { // TODO Auto-generated method stub //創建父類對象animal Animal animal = new Animal(); System.out.println("animal age:"+animal.age); Dog d = new Dog();//主函數里只是創建了子類對象 d.age = 10; d.name = "xiaotian"; d.eat(); } }
運行結果為:
顯然構造方法的初始化方式是後執行的,所以屬性的初始化是先執行的:
總結一下:
當我們創建一個子類對象的時候,先創建父類的屬性進行初始化,然後執行父類的構造方法,接著執行子類的屬性進行初始化,最後執行子類的構造方法。