2012-04-05 86 views

回答

22

主要方法的簽名在Java Language Specifications section 12.1.4規定,並明確規定:

The method main must be declared public, static, and void. It must specify a formal parameter (§8.4.1) whose declared type is array of String.

  • 它必須是public否則就不可能把它
  • 那一定是因爲你static在調用它之前沒有辦法實例化對象
  • 參數String的列表允許從命令行執行Java程序時傳遞參數。它有可能沒有參數地定義它,但是更實用(類似於其他語言)
  • 返回類型爲void,因爲它沒有任何意義:Java程序可以在到達之前終止主要方法的結尾(例如,通過調用System.exit()

方法簽名,因此可以:

public static void main(String[] args) 
public static void main(String... args) 

注意,可變參數版本(...)只是從Java 5

有效的Java語言允許括號[]定位在類型或變量之後(第一個通常是首選),

public static void main(String args[]) // valid but usually non recommended 

也是有效

+0

你可以很容易地創建一個新的啓動器,它可以以不同的方式完成,方法不必是公開的(JNI接口允許你調用任何**方法),它不一定是靜態的,JNI接口可以通過調用它的構造函數再次創建任何對象**,然後調用實例方法。 – 2012-04-05 12:53:36

+3

@MaurícioLinhares我完全知道我可以打電話給我想要的任何東西,但不能保證它能正常工作。一個JVM(還有其他JVM也不是來自Oracle)只是被迫遵循規範。他們可能只是產生一個錯誤,並告訴你「沒有辦法,即使技術上可行,也不是標準的」。規範被稱爲規範的原因。 – Matteo 2012-04-05 12:56:42

+0

**不能保證它會工作**?你是什​​麼意思?我的個人發射器無法工作,因爲規範說明了嗎?任何啓動程序**都可以工作**只要所啓動的類符合標準,請檢查其他答案和源代碼示例。 – 2012-04-05 12:58:37

0

主要的方法必須是public,所以當類加載時,它可以被JVM找到。同樣,它必須是static,這樣才能在加載該類之後調用它,而不必創建它的一個實例。所有的方法必須有返回類型,在這種情況下,它是void.

+0

所以我們可以有一個非空的返回類型嗎?我是新來的java – amar 2012-04-05 12:35:32

+0

@amar不,它必須是無效的,因爲它在語言規範中被定義爲 – Matteo 2012-04-05 12:48:31

0

我無法回答該方法的參數,但它必須是公開的,因爲jvm必須能夠訪問該函數並且它必須是靜態的,因爲jvm不知道如何創建你的類的實例。

這篇文章提供了關於推理靜態的好詳細的解答:Why is the Java main method static?

這篇文章提供了爲什麼主要是無效的一個很好的答案:Why is main() in java void?

-2

你可以,如果你創建了一個新的Loader改變你的應用。 public static void main(String args []) format僅僅是默認的解決方案,人們在JVM上發現調用你的Java程序,所以有一個明確的方法來做到這一點。

真正實現我們今天只是使用JNI接口使用this function調用公共靜態無效的主要(字符串ARGS [])方法,因此,如果你想使用JNI,你可以很容易地寫完全相同的代碼和有不同的方法來加載你的應用程序。

Here's an example in code它取自this page

這是當前的linux啓動程序the method lookup starts here

+0

您確定嗎?我的熱點源代碼有硬編碼:'(* env) - > GetStaticMethodID(env,mainClass,「main」, 「([Ljava/lang/String;)V」);' – Voo 2012-04-05 12:41:58

+0

不是在語言規範中定義的,只有按照定義實施才能保證工作。任何不符合規格的東西都不能保證正常工作。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.1.4 – Matteo 2012-04-05 12:45:04

+0

當然是,請檢查啓動器的源代碼。 https://gist.github.com/2310831#L465 – 2012-04-05 12:50:21

2

如果你看看JDK的源代碼(JDK-SRC \ J2SE的\ src \共享\ BIN \ java.c):

/* Get the application's main method */ 
mainID = (*env)->GetStaticMethodID(env, mainClass, "main", 
        "([Ljava/lang/String;)V"); 
... 
{ /* Make sure the main method is public */ 
... 
mods = (*env)->CallIntMethod(env, obj, mid); 
if ((mods & 1) == 0) { /* if (!Modifier.isPublic(mods)) ... */ 
    message = "Main method not public."; 
    messageDest = JNI_TRUE; 
    goto leave; 
... 

它變得非常清楚,它必須只有這個簽名。

+3

我同意但JDK代碼不是正確的參考。語言規格是 – Matteo 2012-04-05 12:53:16

+1

該規範的實現不是正確的參考?這一個吹了我。 – 2012-04-05 12:56:39

+9

否*一個規範的實現不是一個參考。甚至可能是錯的。沒有*執行。只有* an *實現。 – Matteo 2012-04-05 12:59:09

-2
  • 公共主()必須通過的任一個一起使用的方法的類的外部以及所述類內部,從而它的公共

  • 靜態靜電是必要bcoz在Java如果我們定義類比我們爲該類定義的對象,並且只有比我們可以使用該類...而不是我們直接使用寫入單詞靜態

  • void-for main()不能返回任何值,如int或char main() - main是我們可以用來訪問java的未來的函數或方法 字符串在Java中所有我們寫考慮作爲一個字符串 ARGS論點

0

If not, why is it not hard coded that main(String arg[]) would stand for public static void main(String arg[]) always?

你可以有方法稱爲「主」與你喜歡的任何簽名和訪問。特殊規則僅適用於您希望JVM調用以啓動程序的方法。

public class Test { 
    public static void main(String[] args) { 
    StrangeMain m = new StrangeMain(); 
    System.out.println(m.main()); 
    System.out.println(m.main(new String[]{"aaa","bbb"})); 
    } 
} 

class StrangeMain{ 
    protected String main(){ 
    return "xyzzy"; 
    } 
    protected String main(String[] arg){ 
    return arg[0]; 
    } 
} 

編譯,運行,輸出:

xyzzy 
aaa 
1

公開是一種訪問符由於我們可以從類的外部訪問。由於main是充當執行點的函數。主函數由類之外的JVM調用,因此它必須聲明爲public。

static是java中用來指定不需要創建任何實例的關鍵字。正如我們所知,main方法也駐留在類中,並且從類外部訪問類的特定功能(在這種情況下來自JVM),因此需要該特定類的實例,因此爲了避免這些,我們只需將靜態訪問課堂外的主要方法。

Void是返回類型,因爲main方法中的其他返回類型是無意義的。

字符串是java中的預定義類名。而args []是數組類型的變量。它是一個String類型對象的變量名稱。所以我們也可以改變args []的名字。字符串類及其對象可以作爲參數在正在運行的程序中傳遞,以便將信息從命令行傳遞給主方法。

0
   Public static void main(String [] ar) 

爲了理解這一點,我們需要知道方法和數組的語法。方法的

語法是:

返回類型方法名

所以主要方法與空隙是返回類型一起被寫入。

語法陣列:

數據類型[] arrayName中

的方括號指示它是否是維陣列。既然我們有一對正方形的牙套它是一個維陣列。

字中的主要方法的含義:

公共:公用是訪問指示符意爲JVM的目的從任何地點執行的主要方法。

靜態:靜態是一個修飾符。主要方法必須聲明爲靜態,以便JVM可以直接使用類名稱訪問主要方法。

當我們執行一個java程序時,我們使用類名,所以當我們寫靜態時它將幫助JVM訪問主要方法。

如果我們刪除靜態,那麼它將成爲實例方法,訪問我們應該創建的實例方法和對象,然後使用對象引用調用方法。

void:void是主方法的返回類型。主要方法的調用方是JVM,JVM不期望主方法有任何值,因此主方法不應返回任何值。這是指定Void的原因。

main:Main是方法名,它是根據Java編碼規範修復的

String []:它用於存儲命令行參數。數組的名稱可以是任何有效的Java標識符。

所以在String []之後,我們可以給任何有效的java標識符命名,它可以是'ar',也可以是'args'。

相關問題