1坪创、我們?cè)诙x或聲明實(shí)例變量的時(shí)候,可以通過(guò)為實(shí)例變量賦值或是通過(guò)代碼塊賦值侍瑟,如果我們以這兩種方式對(duì)實(shí)例變量進(jìn)行初始化猾瘸,那這兩種初始化方式將會(huì)在構(gòu)造函數(shù)執(zhí)行前先執(zhí)行。
實(shí)際上,如果我們對(duì)變量直接賦值或是通過(guò)代碼塊對(duì)其賦值牵触,那么編譯器會(huì)將其中的代碼放到類的構(gòu)造函數(shù)中去,
并且這些代碼會(huì)被放在對(duì)超類構(gòu)造函數(shù)的調(diào)用語(yǔ)句之后 (java要求構(gòu)造函數(shù)的第一條語(yǔ)句必須是超類構(gòu)造函數(shù)的調(diào)用語(yǔ)句)咐低,構(gòu)造函數(shù)本身代碼之前 揽思。如下例子:
public class Student {
/**
* 對(duì)變量直接賦值會(huì)在構(gòu)造函數(shù)執(zhí)行前先執(zhí)行
*/
private int num1 = 1;
private int num2 = num1+1;
public Student(int var) {
System.out.println(num1);
System.out.println(num2);
this.num1 = var;
System.out.println(num1);
System.out.println(num2);
}
/**
* 代碼塊會(huì)在構(gòu)造函數(shù)執(zhí)行前先執(zhí)行
*/
{
num2 += 3;
}
public static void main(String[] args) {
new Student(8); //輸出1、5见擦、8钉汗、5
}
}
2、需要注意的是java是按照編程順序來(lái)執(zhí)行實(shí)例變量初始化器和實(shí)例變量初始化器中的代碼的鲤屡,并且不允許執(zhí)行順序靠前的實(shí)例代碼塊初始化在順序靠后的實(shí)例變量损痰。如下:
public class Student {
{
j = i; //編譯不通過(guò)
}
private int i = 1;
private int j;
}
public class Student {
private int j = i; //編譯不通過(guò)
private int i = 1;
}
上面兩種情況編譯都不通過(guò)。編譯是會(huì)提示我們使用一個(gè)未經(jīng)定義的變量酒来。之所以這么做是因?yàn)橐WC一個(gè)變量在使用之前已經(jīng)被初始化卢未。
但是我們?nèi)匀豢梢员荛_這種語(yǔ)法檢查。如下:
public class Student {
private int j = getI();
private int i = 1;
public Student() {
i = 2;
}
public int getI() {
return i;
}
public static void main(String[] args) {
Student stu = new Student();
System.out.println(stu.j); //輸出0堰汉,可以知道j被賦予了i的默認(rèn)值0辽社,并且該操作發(fā)在實(shí)例i初始化之前和構(gòu)造函數(shù)執(zhí)行前
}
}
參考:https://blog.csdn.net/justloveyou_/article/details/72466416