首頁 > Java > java教程 > 主體

Java中關於構造器的使用詳解

黄舟
發布: 2017-07-30 10:25:48
原創
1799 人瀏覽過

這篇文章主要介紹了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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!