攜程 Java 工程師的面向?qū)ο竺嬖囶}
這是伯樂在線小組的一個(gè)熱門討論帖
public class Base
{
private String baseName = "base";
public Base()
{
callName();
}
public void callName()
{
System. out. println(baseName);
}
static class Sub extends Base
{
private String baseName = "sub";
public void callName()
{
System. out. println (baseName) ;
}
}
public static void main(String[] args)
{
Base b = new Sub();
}
}
求這段程序的輸出。
來自 未老莫還鄉(xiāng) 的評論:
【不要在構(gòu)造器里調(diào)用可能被重載的虛方法,這是極度危險(xiǎn)的】。構(gòu)造器的初始化順序大概是 父類靜態(tài)塊 子類靜態(tài)塊 父類初始化語句 父類構(gòu)造函器 子類初始化語句 子類構(gòu)造器。父類構(gòu)造器執(zhí)行的時(shí)候,調(diào)用了子類的重載方法,然而子類的類字段還在剛初始化的階段,剛完成內(nèi)存布局,只能輸出null。
來自 ihuning 的精華評論:
看我大師歸來:
1. Base b = new Sub();
2. Base b = 直接忽略,從 new Sub();開始
3. 類加載器加載 Base,Sub 類到j(luò)vm;
4. 為Base,Sub 類中的兩個(gè)屬性baseName 分配存儲空間,但是不初始化;
注意:屬性的初始化時(shí)放在構(gòu)造器中,按照代碼順序執(zhí)行的。
5. new Sub會調(diào)用Sub的無參構(gòu)造器,而在這個(gè)構(gòu)造器中會隱式調(diào)用父類Base的.無參構(gòu)造器;
6. 父類Base的構(gòu)造器中代碼本質(zhì)是
public Base()
{
baseName = "base";
callName();
}
即父類的屬性baseName 的值為base。但為何輸出null,騷年別急。
7. 因?yàn)楦割悩?gòu)造器方法是在子類中調(diào)用的,即大環(huán)境是子類。此時(shí),調(diào)用的方法callName()當(dāng)然是指子類的方法。而這個(gè)方法打印的屬性baseName當(dāng)然也是子類的。那現(xiàn)在子類的屬性baseName的值是多少呢?答案是null.因?yàn)榇藭r(shí)子類Sub的構(gòu)造器內(nèi)代碼本質(zhì)是:
super();
baseName="sub";
此時(shí)baseName="sub"還沒執(zhí)行。
因此,左后的值當(dāng)然是null.
【攜程 Java 工程師的面向?qū)ο竺嬖囶}】相關(guān)文章:
java工程師面試題05-07
Java軟件工程師綜合面試題06-05
java面試題01-31
java學(xué)習(xí):Java面試題和答案07-23
Java面試題集07-19
java基礎(chǔ)面試題02-26
Java框架面試題07-09