java构造器详解_Java中关于构造器的使用详解
這篇文章主要介紹了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构造器详解_Java中关于构造器的使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 表单属性_php表单常用属性
- 下一篇: java的sql的like_[Java教