關于Java程序代碼執(zhí)行的時刻詳細,可以參考Java面試相關(一)-- Java類加載全過程。
示例代碼如下:
public class Test {
//靜態(tài)成員
private static int A;
//成員塊
{
System.out.println("成員塊1");
}
//靜態(tài)成員塊
static{
System.out.println("靜態(tài)代碼塊");
A = 2;
}
//成員對象point
private Point point = new Point();
/**
* 構造方法
*/
public Test(){
System.out.println("Test的構造方法");
}
{
System.out.println("成員塊2");
}
public static class Point{
public Point(){
System.out.println("Point的構造方法");
}
}
public static void main(String[] args){
Test test = new Test();
}
}
運行結果:
靜態(tài)代碼塊
成員塊1
Point的構造方法
成員塊2
Test的構造方法
解析:
?當程序在找到main方法入口并準備執(zhí)行前,Test類本身需要進行編譯、加載和初始化 這三個過程:
- 編譯:如果Test.class沒有生成或者代碼更新了币他,就會重新將.java文件編譯成.class文件,準備加載憔狞。
- 加載:加載這個過程要細分的話蝴悉,包含:驗證、準備瘾敢、解析拍冠、對主動引用類的情況做處理,這幾個過程簇抵,詳細可以看本文前言的文章鏈接庆杜。可以理解為:加載過程主要是保證編譯好的.class文件的數(shù)據(jù)順利被JVM理解并可控正压。
- 初始化:首先就將Test類整體掃描一遍欣福,并將所有靜態(tài)成員附上初始值和靜態(tài)代碼塊都執(zhí)行一遍【所以责球,類靜態(tài)代碼焦履,也稱為初始化塊拓劝,在初始化使被執(zhí)行】,之后嘉裤,再通過這個入口方法郑临,執(zhí)行main方法中的代碼。
- 執(zhí)行main方法屑宠,
new Test()
構建一個新的Test類對象厢洞,所以,所有的類成員方法塊(包括成員變量的賦值)典奉,都會按照代碼先后順序執(zhí)行躺翻。在這些成員代碼塊執(zhí)行完成后,才會調用類的構造方法卫玖。 -
Point point = new Point();
就是因為new Test()
而執(zhí)行成員代碼塊所以觸發(fā)的公你,于是這里Point類也有一個初始化和構建的過程。