2013-10-17 72 views
1

我無法理解以下代碼的執行情況。我想要遵循Java程序,以便我能夠理解一切如何協同工作。我在Eclipse中加強了斷點,但它不能解釋原因。代碼如下:Java靜態方法vs主要靜態方法

public class Sequence { 
    public Sequence() { 
     System.out.print("c "); 
    } 

    { 
     System.out.print("y "); 
    } 

    public static void main(String[] args) { 
     new Sequence().go(); 
    } 

    void go() { 
     System.out.print("g "); 
    } 

    static { 
     System.out.print("x "); 
    } 
} 

該代碼的輸出是x y c g。有人可以解釋爲什麼這是嗎?我認爲程序入口點是public static void main,但它似乎static首先執行?

+0

你不明白什麼? – SLaks

+1

你不明白什麼?靜態塊?它不是一個方法(在源代碼中),它是一個**初始化**塊,即。首先發生。 –

+0

我以爲程序會先打印'c',但打印出'x'。我不明白爲什麼。 – cooldood3490

回答

3

main開始之前執行static塊,因此將打印x

然後我們進入主,我們稱之爲

new Sequence().go(); 

它調用Sequence構造。具體根據靜態塊,Sequence構造被調用(所以前一個新Sequence對象被初始化)時,實例塊(一個大括號內寫的)被執行,因此y獲取打印。

然後構造函數調用打印c

最後,go()方法在新創建的對象上被調用,因此g被打印。

,所以該完整輸出將是

x y c g 
2

的JLS是幫助在這裏,chapter 12要精確。

首先static塊會運行。當班級由ClassLoader加載時會發生這種情況。

然後main會運行,這是由JVM執行來啓動應用程序。

然後當你調用new Sequence()時你的構造函數被執行。編譯器會將您的實例初始化程序(大括號內的位)推送到構造函數的頂部(隱式調用超類構造函數之後)。所以大括號中的位首先運行構造函數中的代碼。

最後調用方法go()

因此代碼的輸出是x y c g

1

在你的類你已經使用

//constructor 
    public Sequence() { 
     System.out.print("c "); 
    } 

    //instance init block 
    { 
     System.out.print("y "); 
    } 

    //method 
    void go() { 
     System.out.print("g "); 
    } 

    //static init block 
    static { 
     System.out.print("x "); 
    } 

- >初始化塊在它們出現的順序執行。

- >當初次加載類時,靜態初始化塊會運行一次。

- >每次創建類實例時都會運行實例init塊。

- >實例init塊在構造函數調用super()後運行。

- >構造函數在創建實例後運行。

根據所有的掌管你有,如預期x y c g輸出

1

Java類加載後,任何方法之前執行靜態塊。主要方法是任何程序的入口點,但它是一種方法,然後是靜態類初始化。

1

第一個jvm在應用程序啓動時加載靜態塊。所以首先執行靜態塊。 然後開始執行主方法。

{ 
     System.out.print("y "); 
} 

是構造塊當u實例類它會被稱爲每次都將被複制到每一個構造函數,因此。 點擊here

1

步驟:

我。當類加載時,首先執行靜態塊。

ii。該類的每次對象被實例化,然後初始化框 即

{ 
    System.out.print("y "); 
} 

is executed(every time) and after that the time of constructor comes to be executed. 

III。當對象創建完成後,執行go()方法。 因此輸出。