[英]NullPointerException : Overriding constructor calling method of Base class in Derived class
我有這段代碼:
class Base {
public Base() {
method();
}
void method() {
System.out.println("In Base");
}
}
class Derived extends Base {
private String bar;
public Derived() {
bar="bar";
}
public void method() {
System.out.println(bar.length());
}
public static void main(String[] args) {
Base base=new Derived();
base.method();
}
}
在執行代碼時,我得到了一個異常:
Exception in thread "main" java.lang.NullPointerException
at Derived.method(Main.java:22)
at Base.<init>(Main.java:5)
at Derived.<init>(Main.java:17)
at Derived.main(Main.java:27)
我無法理解為什么有NullPointerException
和異常的stackTrace
。 有人可以幫我理解嗎?
你可以在這里查看代碼。
new Derived()
創建一個Derived
對象,這意味着首先調用它的超類構造函數,然后調用method
- 但是你有覆蓋method
所以它是被調用的那個方法的子版本。 在該方法中,您調用尚未初始化的bar.length
。
結論:在構造函數中調用可覆蓋的方法幾乎絕不是一個好主意。
您提供的代碼是反模式 。 我們永遠不應該從constructor
調用方法處理字段,原因很簡單,它可能會產生意外結果 。
從您的代碼中,您正在嘗試在Derived
構造函數中初始化一個名為bar
的字段。 現在,當你說Base b = new Derived()
,調用會以下列方式發生
派生的靜態初始化程序 - 如果有的話
基本塊初始化程序 - 如果有的話
Base Constructor - >這是你調用method()
的地方method()
派生塊初始化程序 - 如果有的話
現在由於運行時多態性 ,在4號中,當Derived
的method()
被調用時, bar
尚未初始化為值"bar"
(因為初始化發生在第6位),NPE發生
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.