php键顺序初始化,Java类中各成员初始化的顺序
了解Java中類各個成員的初始化順序是非常重要的,這樣你可以對類有全局的認識。不說太多,直接看下面的例子
class Father
{
static{
System. out.println("父類靜態(tài)代碼塊初始化" );
}
{
System. out.println("父類代碼塊初始化" );
}
private static String s=print();
public static String print()
{
System. out.println("父類靜態(tài)方法" );
return "父類靜態(tài)成員變量的初始化" ;
}
public Father()
{
System. out.println("父類無參構(gòu)造函數(shù)初始化完成" );
show();
}
public void show()
{
System. out.println("父類show()方法" );
}
}
class Son extends Father
{
static{
System. out.println("子類靜態(tài)代碼塊初始化" );
}
{
System. out.println("子類代碼塊初始化" );
}
private static??int i=1;
private String s="子類私有成員變量" ;
public void show()
{
System. out.println("子類show()方法:i=" +i);
}
public Son()
{
System. out.println("子類構(gòu)造函數(shù)初始化完成" );
show();
}
}
public class TestClassLoadSeq {
public static void main(String[] args)
{
new Son();
}
}
輸出結(jié)果:
父類靜態(tài)代碼塊初始化
父類靜態(tài)方法
子類靜態(tài)代碼塊初始化
父類代碼塊初始化
父類無參構(gòu)造函數(shù)初始化完成
子類show()方法:i=1
子類代碼塊初始化
子類構(gòu)造函數(shù)初始化完成
子類成員變量初始化完成:s=子類私有成員變量
子類show()方法:i=1
從結(jié)果可以看出類中各成員初始化的順序是:
1.如果類中存在繼承關(guān)系(像 Son 繼承 Father)??則首先會初始化導(dǎo)出類(Son)的基類(Father),然后再是導(dǎo)出類
2.在基類首先會初始化靜態(tài) 的東西??靜態(tài)塊>靜態(tài)變量??而且只初始化一次 (因為靜態(tài)的東西都是跟著類的加載而加載的)
3.隨后就是初始化導(dǎo)出類的靜態(tài)東西??跟基類的靜態(tài)初始化一樣(同上)
4.初始化基類無參構(gòu)造器(調(diào)用有參就初始化有參構(gòu)造器)
5.初始化導(dǎo)出類無參構(gòu)造器(注意:導(dǎo)出類的成員變量和代碼塊都是是比構(gòu)造函數(shù)的初始化要早。。看輸出結(jié)果可知)
在上面輸出結(jié)果大家可能會看到在基類中的構(gòu)造器中調(diào)用了show() 方法,這樣的輸出可能不奇怪,我現(xiàn)在改一下。
class Father
{
private static String s= print();
static{
System. out.println("父類靜態(tài)代碼塊初始化" );
}
{
System. out.println("父類代碼塊初始化" );
}
public static String print()
{
System. out.println("父類靜態(tài)方法" );
return "父類靜態(tài)成員變量的初始化" ;
}
public Father()
{
System. out.println("父類無參構(gòu)造函數(shù)初始化完成" );
show();
}
public void show()
{
System. out.println("父類show()方法" );
}
}
class Son extends Father
{
static{
System. out.println("子類靜態(tài)代碼塊初始化" );
}
{
System. out.println("子類代碼塊初始化" );
}
private int i =1;
private String s="子類私有成員變量" ;
public void show()
{
System. out.println("子類show()方法:i=" +i);
}
public Son()
{
System. out.println("子類構(gòu)造函數(shù)初始化完成" );
System. out.println("子類成員變量初始化完成:s=" +s);
show();
}
}
public class TestClassLoadSeq {
public static void main(String[] args)
{
new Son();
}
}
輸出結(jié)果:
子類靜態(tài)代碼塊初始化
父類代碼塊初始化
父類無參構(gòu)造函數(shù)初始化完成
子類show()方法:i=0
子類代碼塊初始化
子類構(gòu)造函數(shù)初始化完成
子類成員變量初始化完成:s=子類私有成員變量
子類show()方法:i=1
可以看出跟上面的代碼沒有什么不同,唯一的不同就是我把導(dǎo)出類中的靜態(tài)成員變量i 變成了成員變量i,可以看出結(jié)果是截然不同,現(xiàn)在的結(jié)果是:0
原因:因為上面的靜態(tài)成員變量是跟著類的加載而初始化的??所以結(jié)果是1??而下面的是 成員變量又因為現(xiàn)在還在基類構(gòu)造器中所以導(dǎo)出類中的成員變量還沒有得到初始化??所以是0
所以上面的初始化順序不夠完整,現(xiàn)在補全下:
首先jvm加載類時 會對每個對象的默認初始化 為0??,對通過組合方式的引用類型 默認初始化為 null
總結(jié):
java中首先初始化基類在初始化導(dǎo)出類(有多少個基類初始化多少個)
如果那里有錯誤希望大家?guī)兔μ岢隽舜蠹乙黄饘W(xué)習(xí)(自己也在學(xué)習(xí)中。。。。)。
提示:??java中的各成員初始化的順序是非常重要的,很好的掌握對以后的學(xué)習(xí)非常有幫助
總結(jié)
以上是生活随笔為你收集整理的php键顺序初始化,Java类中各成员初始化的顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京租车多少钱一天?带司机
- 下一篇: 日常安排php,PHP日常开发小技巧