AVA是一門面向?qū)ο蟮木幊陶Z言啦鸣,這里考慮“類”里面在程序開始執(zhí)行時的執(zhí)行順序盈简。
先看一個實例:
class Person{
static {
System.out.println("執(zhí)行Person靜態(tài)代碼塊");
}
{
System.out.println("執(zhí)行Person構(gòu)造代碼塊");
}
public Person(){
System.out.println("執(zhí)行Person無參構(gòu)造方法");
}
public Person(String name){
System.out.println("執(zhí)行Person構(gòu)造方法"+ name);
}
}
class Student extends Person{
static {
System.out.println("執(zhí)行Student靜態(tài)代碼塊");
}
{
System.out.println("執(zhí)行Student構(gòu)造代碼塊");
}
public Student(String name){
super(name);
System.out.println("執(zhí)行Student構(gòu)造方法" + name);
}
public Student(){
super();
System.out.println("執(zhí)行Student無參構(gòu)造方法");
}
}
public class ExtendsStaticConstruct {
public static void main(String args[]){
Student student1 = new Student("lili");
System.out.println("--------------------");
Student student2 = new Student();
}
}
執(zhí)行結(jié)果:
執(zhí)行Person靜態(tài)代碼塊
執(zhí)行Student靜態(tài)代碼塊
執(zhí)行Person構(gòu)造代碼塊
執(zhí)行Person構(gòu)造方法lili
執(zhí)行Student構(gòu)造代碼塊
執(zhí)行Student構(gòu)造方法lili
--------------------
執(zhí)行Person構(gòu)造代碼塊
執(zhí)行Person無參構(gòu)造方法
執(zhí)行Student構(gòu)造代碼塊
執(zhí)行Student無參構(gòu)造方法
說明:
一般的類里面包含:
1碑诉、靜態(tài)代碼塊(靜態(tài)區(qū)、靜態(tài)變量等)
2纳令、構(gòu)造代碼塊({ }中間的內(nèi)容)
3挽荠、構(gòu)造方法
其執(zhí)行順序也是1、2平绩、3先后執(zhí)行圈匆,這里需要注意的是:考慮繼承特性。
子類與父類的執(zhí)行順序是:
1馒过、先執(zhí)行父類的靜態(tài)代碼塊(父1)
2臭脓、子類的靜態(tài)代碼塊(子1)
3酗钞、父類構(gòu)造代碼塊(父2)
4腹忽、父類構(gòu)造方法(父3)
5、子類構(gòu)造代碼塊(子2)
6砚作、子類構(gòu)造方法(子3)
當(dāng)一個類從被JVM裝載開始窘奏,各種代碼的執(zhí)行順序大致如下:
被JVM裝載->
執(zhí)行父類的相關(guān)代碼->
如果有靜態(tài)初始化,先執(zhí)行靜態(tài)初始化葫录,且只執(zhí)行一次着裹,以后即使有該類實例化,也不會再執(zhí)行->
如果有靜態(tài)代碼塊米同,以與靜態(tài)初始化一樣的方式執(zhí)行->
如果有new語句帶來的實例化骇扇,先為成員變量分配空間,并綁定參數(shù)列表面粮,隱式或顯式執(zhí)行super()少孝,即父類的構(gòu)造方法->
執(zhí)行非靜態(tài)代碼塊->
執(zhí)行本類的構(gòu)造函數(shù)->
執(zhí)行其他代碼。
這里的執(zhí)行順序同子類構(gòu)造中有一個默認(rèn)的父類構(gòu)造super()無關(guān)熬苍,不是執(zhí)行到隱藏的super()才開始初始化父類的稍走,類的初始化是分層初始化,即先初始化父類柴底,再初始化子類婿脸,初始化每個類的過程中,進(jìn)行類的初始化工作柄驻,先進(jìn)性成員變量的初始化狐树,成員變量的初始化順序是:默認(rèn)初始化,即int為0這種->顯示初始化鸿脓,例如給int型顯示初始化了值->構(gòu)造方法初始化褪迟,所以是這里執(zhí)行到了構(gòu)造方法冗恨。