2 回答

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
根據(jù)對(duì)您問(wèn)題的評(píng)論,問(wèn)題似乎是您重寫(xiě)了諸如 等方法setCharacteristics(...)并setSchedulingInterval(...)在超級(jí)構(gòu)造函數(shù)中調(diào)用這些方法。
如果不了解更多有關(guān)系統(tǒng)正在做什么以及重寫(xiě)這些方法如何影響應(yīng)用程序內(nèi)部工作的信息,就很難給出您可能面臨的問(wèn)題的確切示例。因此,我將嘗試提供一個(gè)更抽象的示例,并希望我能夠傳達(dá)可能出現(xiàn)問(wèn)題的想法。
假設(shè)我們有以下課程:
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;
}
}
正如您所看到的,重寫(xiě)了構(gòu)造函數(shù)中使用的SubType
方法。為什么這是一個(gè)問(wèn)題?setName(...)
SuperType
考慮調(diào)用時(shí)初始化發(fā)生的順序new SubType("some name")
:
構(gòu)造函數(shù)
SubType(...)
調(diào)用超級(jí)構(gòu)造函數(shù),即SuperType(...)
在執(zhí)行構(gòu)造函數(shù)之前,將創(chuàng)建并初始化實(shí)例。
對(duì)于層次結(jié)構(gòu)中的每個(gè)類,從上到下(從超級(jí)類型到子類型),這種情況按以下順序發(fā)生字段按照列出的順序排列
初始化塊按照列出的順序排列
constructor
因此,我們的示例中有以下執(zhí)行順序(Object
為了簡(jiǎn)單起見(jiàn),我將保留不存在的初始化)
SuperType(...)
構(gòu)造函數(shù)(因?yàn)闆](méi)有初始化塊)setName(...)
正在被調(diào)用,但這是被覆蓋的版本SubType
字段被初始化,設(shè)置id
為隨機(jī)數(shù)SubType
初始化塊運(yùn)行SubType(...)
構(gòu)造函數(shù)運(yùn)行
正如您所看到的,重寫(xiě)setName(...)
是在id
初始化之前執(zhí)行的,因此該方法將看到的所有內(nèi)容都將是其默認(rèn)值(對(duì)于primitive 為0 int
)。并且根據(jù)您的應(yīng)用程序可能會(huì)出現(xiàn)問(wèn)題 - 重寫(xiě)的方法可能依賴于正確初始化的一些附加變量(例如不為空),如果沒(méi)有發(fā)生這種情況,實(shí)例可能仍然會(huì)被創(chuàng)建,但無(wú)法從您的應(yīng)用程序中使用觀點(diǎn)看法。

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
當(dāng)你有類似的事情時(shí):
Datacenter d = new MyDatacanter(...);
唯一可訪問(wèn)的方法d是超類中定義的方法Datacenter,除非您將其轉(zhuǎn)換d為MyDatacenter對(duì)象:
d.yourCustomMethod(); //won't work
((MyDataCenter) d).yourCustomMethod(); //should work fine
添加回答
舉報(bào)