2013-10-22 35 views
0

我不知道這個問題是否曾被詢問過。我搜索過但找不到任何重複的問題。如果您發現任何相關問題,請提及鏈接。阻止作用域輸出

public class Exp 
{ 
    Exp() 
    { 
     System.out.println("Hello");  //3 
    } 
    { System.out.println("Hello")}; //1 
    { static{System.out.print("x");} //2 
} 

消息的打印順序是2,1,3。

這些是什麼線1 & 2和爲什麼的一類EXEC順序

+0

什麼樣的印刷順序?此代碼甚至不運行... – Zong

+0

靜態內容在對象構建之前首先被初始化。 –

+0

@宗錚李這是不完整的一段代碼。只需初始化Exp類。 –

回答

3

行「1」是一個實例初始值設定程序,它在任何構造函數被調用之前首次創建對象時運行。

行「2」是一個靜態初始化程序,它在任何對象創建之前首次加載類時運行。

Section 12.5 of the JLS指定當實例初始化器運行:

就在到新創建的對象的引用被返回作爲 結果,所指示的構造被處理使用下面的過程來初始化新 對象:

將構造函數的參數分配給此構造函數調用的新創建的參數 變量。

如果此構造有明確的構造函數調用 開始(§8.8.7.1)在同一個類(使用本)另一個構造的,然後 評估該構造函數調用 遞歸使用這些相同的五個步驟的參數和過程。如果構造函數 調用突然完成,則此過程由於相同的原因突然完成 ;否則,請繼續步驟5.

此構造函數沒有以相同類中的另一個構造函數調用另一個構造函數 (使用此方法)。如果 此構造函數用於Object以外的類,則此構造函數將以顯式或隱式調用超類構造函數(使用super)開始。評估參數和 處理該超類的構造函數調用遞歸使用這些 相同的五個步驟。如果該構造函數調用突然完成,則 由於相同的原因,此過程突然完成。否則, 繼續步驟4

執行實例初始化和實例變量初始化 這個類,分配實例變量初始化的 到相應的實例變量的值,在左到右的順序在 它們以文本形式出現在類的源代碼中。如果 執行這些初始化程序中的任何一個都會導致異常,那麼將不會執行其他初始化程序,並且此過程會突然以相同的異常完成 。否則,請繼續步驟5.

執行此構造函數的其餘部分。如果執行 突然完成,那麼此過程突然完成,原因相同 。否則,此過程正常完成。

(重點煤礦)

構造體的其餘部分實例初始化後執行。

1

靜止象素塊與常數(靜態最終部件)沿着類加載期間執行的意義。 3在對象被實例化時被調用。 爲了您更好地理解,通過IDE調試代碼來理解執行順序。

+1

好的,爲什麼我們會關心你的博客? – noone

+1

請不要爲您的博客做廣告,除非它與該問題非常相關。 – Zong

+0

好吧,對不起,新的在這裏。將來會照顧到這一點。 –

1

參見http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

靜態初始化塊是一個代碼正常塊包圍在括號{},並通過靜態關鍵字之前。下面是一個例子:

static { 
    // whatever code is needed for initialization goes here 
} 

一個類可以有任意數量的靜態初始化塊,它們可以出現在類體中的任何地方。 運行時系統保證靜態初始化塊按它們出現在源代碼中的順序被調用。

0

執行順序的原因是,在非靜態塊中,您可能想要使用靜態成員,但在靜態塊中,您不能使用非靜態成員。所以首先執行靜態塊是有意義的。 非靜態塊允許你抽象每個構造函數需要執行的代碼,因此它在構造函數之前被執行。

執行的更詳細的順序爲:該類的父類

2.static塊

3.非靜態的超類

4.constructor的塊的

1.static塊超級類別

5.此類別的非靜態塊

6.該類別的構造者

+0

相當複雜,並且(至少)部分不正確。 –