2013-09-25 54 views
1

我知道靜態塊在main之前運行。 但是,正常的塊也運行之前主或主後?靜態塊和普通塊

class prog 
{ 
static 
{ 
System.out.println("Static"); 
} 
{ 
System.out.println("Block"); 
} 

public static void main(String args[]) 
{ 
prog obj=new prog(); 
System.out.println("Main"); 
} 
} 
+5

你爲什麼不跑來看看自己? – SudoRahul

+1

說真的,在fav IDE中運行此代碼會更容易。如果您手頭沒有,請使用http://ideone.com –

+0

更具體地說,靜態塊在類被加載時運行......哪一個是在main之前。 –

回答

1

靜態塊在加載類時執行,其中當創建包含該塊的類的實例時執行常規塊。

只是在java 7以前的記錄靜態塊被執行之前,在項目中搜索main()方法。但是從java 7 main()首先查找。所以你會得到一個錯誤,如果你沒有main.So I know the static blocks run before main有點含糊不清。在執行靜態塊之前查找main()方法,但主要執行將在處理靜態塊之後開始。

在調用相應的構造函數之前,還會執行非靜態塊。 例如

public class Tester { 

{ 
    System.out.println("In some random block"); 
} 

static { 
    System.out.println("In static block"); 
} 

public Tester() { 
    System.out.println("Constructor"); 
} 


public static void main(String args[]) { 
    Tester t = new Tester(); 
} 


} 

將打印時一個類的實例被實例化

In static block 
In some random block 
Constructor 
0

非靜態塊一個,只要你實例化一個對象,你的情況inside main運行。嘗試之前打印的東西prog obj=new prog();

如果我有像下面這樣的東西,它會在main之前運行。

class prog { 
    static { 
     System.out.println("Static"); 
    } 
    { 
     System.out.println("Block"); 
    } 

    prog obj = new prog(); 
    public static void main(String args[]) { 
     System.out.println("Main"); 
    } 
} 
+1

*每當您實例化包含這些塊的類的對象*時,就會運行非靜態塊。 –

+0

另外值得一提的是,在執行類構造函數之前,類中的* non-'static * *塊將被執行**。請參閱http://stackoverflow.com/a/17001104/1065197 –

+0

是的,非靜態塊是由編譯器爲所有類生成的'init'方法的一部分,並且該方法在構造函數之前運行。 – Claudiu

2

其實靜態塊或SIB(靜態初始化塊),在加載類加載的時間,因此之前的主()..

執行,但同樣是沒有非靜態的情況下塊或IIB(實例初始化塊),它只是在創建對象(實例)的加載時間,正如其名字也闡明瞭同樣...

我覺得你有我的觀點......

0

靜態塊是塊,如果我們指定任何變量或類靜態我們可以acc通過類名將其數據成員放入另一個類或該類之外。 Normal Block是創建類或創建該類的對象的塊。如果我們想在另一個類中使用它,我們必須創建該類的構造函數,然後才能訪問它的對象。 所以這是靜態塊和普通塊的主要差別塊

0

當編譯時創建該類的實例時,將運行普通塊。靜態塊在程序執行中只會運行一次。所以如果你想在創建該類的實例之前打印一些東西,然後將其放在靜態塊中。

0

正常初始化塊被運行。像main一樣,靜態方法不需要實例,所以這兩個東西是不相關的。