class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I'm A class"); } static { System.out.println("static A"); } } p... ...
class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I'm A class"); } static { System.out.println("static A"); } } public class HelloB extends HelloA { public HelloB() {// 優先調用父類的構造方法 System.out.println("HelloB"); } { System.out.println("I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { new HelloB(); new Dervied(); } } class Dervied extends Base { private String name = "dervied"; public Dervied() { tellName(); printName(); } public void tellName() { System.out.println("Dervied tell name: " + name); } public void printName() { System.out.println("Dervied print name: " + name); } // public static void main(String[] args){ // //1.執行父類的構造方法 2.給自己的成員變數賦值 3。調用構造方法中的調用的方法 多態 // } } class Base { private String name = "base"; public Base() { tellName(); printName(); } public void tellName() { System.out.println("Base tell name: " + name); } public void printName() { System.out.println("Base print name: " + name); } } 輸出: static A static B I'm A class HelloA I'm B class HelloB Dervied tell name: null Dervied print name: null Dervied tell name: dervied Dervied print name: dervied 1, 原因, 類載入時發現B.class 還有父類, 好先去載入 A.class 眾所周知 static 塊 是在.class 里的其執行的比main優先順序更高, 所以先執行父類的static 方法, 好 然後繼續回去載入B.class 的方法 又遇到個static 塊, ok執行它, 終於進 main() 了, new HelloB() ,額等等, 它裡邊隱藏了一部分代碼 : 自動調用的 super(), 好的...先去執行父類的初始化... 執行父類的實例代碼塊, 終於輪到自己了,,,執行自己的實例代碼塊, ok 執行 自身的構造方法 -_-||| 2, 原因, 引用《瘋狂Java講義》中的一段話。因為Java里的方法不能獨立存在,它必須屬於一個類或一個對象,因此方法也不能直接像函數那樣被獨立執行,執行方法時必須使用類或對象作為調用者,即所有的方法都必須使用“類.方法”或“對象.方法”的形式來調用。這裡可能產生一個問題:同一個類里不同方法之間相互調用時,不就可以直接調用嗎?這裡需要指出的是:同一個類的一個方法調用另一個方法時,如果被調用方法是普通方法,則預設使用this作為調用者;如果被調用方法時靜態方法,則預設使用類作為調用者。也就是說錶面上看起來某些方法可以被獨立執行,但實際上還是使用this或類來作為調用者。 那麼這不就和多態似的了嗎 this.tellName();this.printName();....由於初始化父類時對兩個變數還沒賦值(執行super()時,這時的name時被子類覆蓋的, 子類的name還沒初始化呢, 接下來開始執行執行sysout, 然後子類初始化, 初始化變數~, 執行sysout)