2012-09-09 43 views
3
class Temp 
{ 
    { 
     System.out.println("this is in it block"); 
    } 


    public static void main(String... s) 
    { 
     System.out.println("abhi"); 
    } 
} 

上面的代碼不會打印init塊的內容,但我們知道init塊是構造函數的第一行。是否有必要在Java中的每個類中都有構造函數

但另一方面,如果我使用new Temp();它會打印。爲什麼這樣?

如果構造函數在每個類中,上面的代碼也應該在沒有對象初始化的情況下打印它。不應該嗎?

+1

請查看常見問題解答如何正確標記您的問題。這確保您的問題得到正確的人的關注。 –

+0

init代碼塊是構造函數的* second *行,在implict或顯式super()調用之後。 – EJP

回答

0

有沒有在你的代碼調用構造函數,因此實例初始化塊不會被調用無論是。

如果構造函數在每個類中,上面的代碼也應該在沒有對象初始化的情況下打印它。不應該嗎?

號爲什麼要這樣呢?你將不得不致電它的發生。它不會因爲它存在而運行。

5

您不需要在類中編寫構造函數。如果您沒有任何構造函數,系統將自動爲您生成一個默認構造函數。你的內部塊被稱爲instance initializer;它在之後運行 ,當構造函數執行時,在構造函數中調用 super(...)並且在構造函數體的(其餘部分)之前執行 super(...)。 (如果構造函數以 this(...)的調用開始,則不會爲該構造函數運行實例初始化程序。)但是,您確實需要爲構造函數和要執行的任何實例初始化程序創建類的實例。 (如果你做的內部塊 static這將是一個 靜態初始化並會剛好運行一次,當類對象被初始化,無論情況是否已創建。)

0

嗨,如果你運行這段代碼你會明白實例塊和靜態塊之間的區別。

它是第一個運行並且只運行一次的靜態塊,第一次調用靜態方法時或者是第一次啓動實例。就像在你的代碼中你調用一個靜態方法(main),你應該創建一個靜態塊,但它只是調用一次。

實例塊,它始終運行它啓動一個實例。

class Temp 
{ 
    {System.out.println("this is an instance block");} 

    static {System.out.println("this is a static block");} 

    public static void main(String... s){ 
     System.out.println("This a static method"); 
     Temp myTemp = new myTemp(); 
     myTemp.myMethod(); 
    } 

    void myMethod(){ 
     System.out.println("This an instance method"); 
    } 
} 

在另一方面,如果你不輸入任何結構Java將創建一個爲你

Temp(){//Or whatever name of your class 
    super(); 
} 
相關問題