[英]Are statements under curly braces load first?
我知道首先將靜態內容加載到內存中,但是為什么當我沒有提到它為靜態時,為什么在“ CT”之前打印“ IT”呢?
class Person
{
Person()
{
System.out.print(" CP");
}
static
{
System.out.print("SP");
}
}
class Teacher extends Person
{
Teacher()
{
System.out.print(" CT");
}
{
System.out.print(" IT");
}
}
public class StaticTest
{
public static void main(String[] args)
{
Person p = new Teacher();
}
}
初始化程序塊,例如{System.out.print(" IT");}
,在構造函數之前執行。 實際上,它們被復制到每個構造函數的開頭。
初始化實例成員
通常,您需要將代碼放在構造函數中以初始化實例變量。 使用構造函數初始化實例變量有兩種選擇: 初始化塊和final方法。
實例變量的初始化程序塊看起來像靜態初始化程序塊,但沒有static關鍵字 :
{
//初始化所需的任何代碼都在這里
}Java編譯器將初始化程序塊復制到每個構造函數中。 因此,該方法可用於在多個構造函數之間共享代碼塊。
( 來源 )
更確切地說,這是JLS中描述的初始化順序:
將構造函數的參數分配給此構造函數調用的新創建的參數變量。
如果此構造函數以同一個類中的另一個構造函數的顯式構造函數調用(第8.8.7節)開頭(使用此方法),則使用這五個步驟評估參數並遞歸處理該構造函數調用。 如果該構造函數調用突然完成,則該過程由於相同的原因突然完成; 否則,請繼續執行步驟5。
此構造函數並不以對同一類中的另一個構造函數的顯式構造函數調用(使用此函數)開頭。 如果此構造函數用於Object以外的其他類,則此構造函數將以顯式或隱式調用超類構造函數(使用super)開始。 使用這五個相同的步驟,遞歸評估超類構造函數調用的參數和過程。 如果該構造函數調用突然完成,則出於相同原因,此過程也會突然完成。 否則,請繼續執行步驟4。
執行此類的實例初始值設定項和實例變量初始值設定項,將實例變量初始值設定項的值按從左到右的順序在文本中顯示在該類的源代碼中,然后將其分配給相應的實例變量。 如果執行這些初始化程序中的任何一個導致異常,則不會再處理其他初始化程序,並且該過程會因相同的異常而突然完成。 否則,請繼續執行步驟5。
執行此構造函數的其余部分。 如果該執行突然完成,則出於相同原因,此過程也會突然完成。 否則,此過程將正常完成。
請注意,實例構造函數在構造函數的主體(步驟5)之前在步驟4中執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.