2 回答

TA貢獻1982條經驗 獲得超2個贊
根據對您問題的評論,問題似乎是您重寫了諸如 等方法setCharacteristics(...)并setSchedulingInterval(...)在超級構造函數中調用這些方法。
如果不了解更多有關系統正在做什么以及重寫這些方法如何影響應用程序內部工作的信息,就很難給出您可能面臨的問題的確切示例。因此,我將嘗試提供一個更抽象的示例,并希望我能夠傳達可能出現問題的想法。
假設我們有以下課程:
class SuperType {
protected String name;
public SuperType(String n) {
setName( n );
}
protected void setName( String n ) {
name = n;
}
}
class SubType extends SuperType {
// setting 'id' happens here
private int id = new Random().nextInt() + 1;
{
// initializer block, setting 'id' could happen here
}
public SubType( String n ) {
super( n );
// setting 'id' could happen here as well
}
@Override
protected void setName( String n ) {
name = n + " " + id;
}
}
正如您所看到的,重寫了構造函數中使用的SubType
方法。為什么這是一個問題?setName(...)
SuperType
考慮調用時初始化發生的順序new SubType("some name")
:
構造函數
SubType(...)
調用超級構造函數,即SuperType(...)
在執行構造函數之前,將創建并初始化實例。
對于層次結構中的每個類,從上到下(從超級類型到子類型),這種情況按以下順序發生字段按照列出的順序排列
初始化塊按照列出的順序排列
constructor
因此,我們的示例中有以下執行順序(Object
為了簡單起見,我將保留不存在的初始化)
SuperType(...)
構造函數(因為沒有初始化塊)setName(...)
正在被調用,但這是被覆蓋的版本SubType
字段被初始化,設置id
為隨機數SubType
初始化塊運行SubType(...)
構造函數運行
正如您所看到的,重寫setName(...)
是在id
初始化之前執行的,因此該方法將看到的所有內容都將是其默認值(對于primitive 為0 int
)。并且根據您的應用程序可能會出現問題 - 重寫的方法可能依賴于正確初始化的一些附加變量(例如不為空),如果沒有發生這種情況,實例可能仍然會被創建,但無法從您的應用程序中使用觀點看法。

TA貢獻1773條經驗 獲得超3個贊
當你有類似的事情時:
Datacenter d = new MyDatacanter(...);
唯一可訪問的方法d是超類中定義的方法Datacenter,除非您將其轉換d為MyDatacenter對象:
d.yourCustomMethod(); //won't work
((MyDataCenter) d).yourCustomMethod(); //should work fine
添加回答
舉報