2014-05-19 24 views
0

我的問題很簡單,爲什麼我們需要main()的方法? jvm請撥打public static void main()啓動應用程序的方法。以及類加載後也執行的靜態塊。沒有main()該程序給出main method not found exception但你可以通過在靜態塊中添加System.exit(0)行來避免這個錯誤,那麼你的語句之後是什麼點的main()方法?沒有主要的方法有沒有功能?靜態塊與java中的主要方法的區別

class A{ 

public static void main(String ar[]){ 
..... 
.... 
} 

// VS 

static{ 
.... 
... 

System.exit(0); // to avoid main method not found error 

} 

} 
+0

避免異常的唯一原因是因爲您告訴JVM在完成尋找'main()'之前退出。另外,我有些懷疑你能夠在課堂加載階段完成所有的工作...... – awksp

+0

你也可以讓被黑客入侵的靜態塊(類'A')失敗。在完成初始化之前,我會非常懷疑它的任何實例 –

+1

擺脫主要方法時,大量的事情會變得更加困難。你看到了什麼優勢? –

回答

3

static塊未執行該類已加載。它被執行正在加載該類。在靜態塊退出之前,該類沒有完全構建。

-------- ----------編輯

@sky,嘗試運行此程序,並看看會發生什麼:

class Foo { 
    static String name = "Michael"; 
    static { 
     Thread t = new Thread(new Bar()); 
     t.start(); 
     try { 
      Thread.sleep(30000); 
     } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
     } 
    } 
    public static void main(String[] args) { 
    } 
} 

class Bar implements Runnable { 
    public void run() { 
     System.out.println(Foo.name); 
    } 
} 
+0

我不這麼認爲,靜態塊在類加載器完成它的工作後調用。 – sky

+0

@sky類的初始化,包括靜態塊的執行,是在類加載的過程中完成的 – awksp

+1

@sky靜態下的被破解的靜態塊的靜態內容在開始時不會被初始化。你沒有理由增加一個不明智的頭痛。使用黑客入侵的靜態塊會帶來什麼好處? –

3

當然,你失去了一些功能。你如何獲得命令行參數?這樣做可能有一些聰明的技巧,但是沒有必要爲它做一些破解。

在所有應用程序中使用標準main方法的原因是,JVM總是知道塊在項目中查找的位置,以便開始執行。你必須在的地方有標準的

+0

靜態塊也可以通過虛擬機找到,並與命令行參數有什麼大不了?我可以通過其他方式獲得輸入.. – sky

+2

@sky讓我來回答你的問題。你爲什麼要使用'static'塊來運行你的程序並跳過所有這些圈套? – asteri

0

嗯,我沒有然而,只要看看它的面前考慮了很久場景的問題,你不能至少有命令行參數沒有的main()方法

+0

或者我可以通過其他方式獲取參數(如輸入對話框或掃描儀等)。 – sky

+0

這些不會是命令行參數。 (不要假設命令行參數沒有什麼大不了) –

0

由於沒有提及是命令行參數不可能或不必要地難以訪問的問題。

還有在不同類別中有多個市電的節目的問題。有時我會創建一個單獨的主要方法來對新類進行初始測試。如果我必須將它放在靜態初始化塊中,那麼程序的每個預期起點都將在該類加載時運行;這將成爲無益的新bug來源。

它還增加了一個更復雜的類初始化,即低於靜態初始化塊的任何內容都將具有其默認值而非其設定值。例如,下面的打印0

static{ 
    HackedStaticBlock h=new HackedStaticBlock(); 
} 
static int badNumber=17; 

public HackedStaticBlock() { 
    System.out.println(badNumber); 

} 

這是你有時候需要靜態初始化擔心的東西,但這就意味着你不必擔心它在每一個程序。

相關問題