2013-06-21 179 views
-5

System.out.println()語句是否總是被執行?假設我有初始化塊

class c2 
{ 
{ 
System.out.println("initializer"); 
} 
public static void main(String a[]) 
{ 
System.out.println("main"); 
c2 ob1=new c2(); 
} 
} 

那麼爲什麼還要打印「初始化程序」語句?它是否是構造函數聲明?

+0

sopln?我總是稱他們爲「syso」。這是一個標準的速記? –

+0

你試過了嗎?結果是什麼? – sanbhat

+1

在這種情況下是的。每次創建類的實例時都會執行實例初始化程序塊。 –

回答

2

是的,它會打印:

main 
initializer 

一旦你撥打c2。你的默認構造函數的構造函數爲c2類你初始化將被稱爲隱含的樣子:

c2() { 
    { 
    System.out.println("initializer"); 
    } 
} 

請參JLS爲12.4.2. Detailed Initialization Procedure

+0

隨機附加大括號? – imulsion

+1

@imulsion只是爲了突出塊。 – NINCOMPOOP

1

是的,它會的。如果您創建類的實例(c2 ob1=new c2();),則默認構造函數將執行該命令。該程序也會輸出「main」,就像在main方法中調用一個新的命令一樣。

0

這是一個初始化實例成員塊

一個例子當創建C2對象,括號中的系統輸出命令也將被執行。 只要包含在一個塊中,您就可以像這樣添加初始化代碼。

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

爲什麼你會用嗎?

Java編譯器將初始化塊複製到每個構造函數中。 因此,這種方法可用於共享多個構造函數之間的代碼塊。

+0

您可以通過以下方式更容易地在構造函數之間共享代碼:a)從另一個ctor調用一個ctor,和/或b)通過調用ctor的方法(最終是靜態方法)。這比初始化塊更可重用。 –

+1

在某些情況下,輕鬆純粹是主觀的,也取決於您試圖解決的具體問題。還取決於編程級別,問題,編碼風格和知識。 「因此,這種方法**可以用來在多個構造函數之間共享一段代碼。「這是來自官方的oracle文檔 –

+1

我添加了評論_not_,因爲你所說的東西是錯誤的,但是如果稍後有人會閱讀這個答案,它可以被理解爲初始化塊被推薦或至少被廣泛使用 –

-1

是的,但在一個方法中,在這種情況下在c2構造函數中使用該代碼會更好。

+0

多麼有建設性...... – imulsion

+0

你是什麼意思? – Oleksiy