這篇文章主要介紹了Java構造器使用方法及注意事項的相關資料,這裡舉例說明如何使用構造器及需要注意的地方,需要的朋友可以參考下
Java建構器使用方法及注意事項
超類別的建構器在子類別的建構器運行之前運行,也就是說,在建立物件時,先運行超類別中的建構器,然後再運行子類別中的建構器,此時,如果在執行超類別建構器的時候,建構器執行了可覆寫的方法,那麼就會去呼叫子類別中的該方法,而此時子類別還未被實例化,此時就有可能出問題。
以一個例子說明:
public class Super { int age = 10; protected void say() { System.out.println("super"); } public Super() { override(); } public void override() { System.out.println("super override"); } } class Sub extends Super { int age = 9; private final Date date; public Sub() { date = new Date(); } @Override public void override() { System.out.println(date); } @Override protected void say() { System.out.println("sub"); } public static void main(String[] args) { Super sub = new Sub(); sub.override(); // sub.say(); // System.out.println(sub.age); } }
建立兩個類,一個Super.java,其中定義一個成員變數age= 10,並且在構造器中呼叫了override() 方法。 Sub.java 繼承了 Super.java,並且在建構方法中初始化了 date。
現在我們執行 main 方法,控制台會印出什麼呢? 是一個 date? 還是兩個 date? 答案是先印出 null,然後再印出具體的 date 值。而如果在 Sub.java 的 override 方法中呼叫 date 的任意方法時,會出現 NPE
為什麼會這樣呢?
我們知道在使用new 來建立物件的時候,會先檢查該類別是否繼承自父類,如果是,則會先呼叫父類別的建構方法,該案例中,在new Sub() 時,發現Sub 是Super 的子類,於是先呼叫Super 的建構方法,在Super 構造方法中,發現呼叫了override 方法,於是又去找子類Sub 是否重寫了override 方法,發現該子類別重寫了,則呼叫子類別的override,列印出date,而此時date 還未被初始化,所以值為null。
在父類別的建構方法執行完畢後,再執行子類別的建構方法,此時 date 被初始化了,所以再次呼叫 override 方法時,則會正確列印出 date。
當呼叫 sub.age,會印出什麼?是 10 還是 9 ?
其實是列印出10,建立物件的時候,實例變數有兩種類型,前面是宣告類型,後面是實際類型
Super sub = new Sub();
sub 的宣告類型為Super,實際類型為Sub。
當呼叫成員變數的時候,會先在宣告型別中尋找該變數,如果該變數存在,則使用宣告型別中的變數值,如果不存在,則在實際型別中去尋找該變數。
而呼叫方法的話,優先在子類別中尋找對應方法,如果子類別中不存在,再呼叫父類別中方法。
以上是Java中關於構造器的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!