我最近在考試中詢問public static void main(String arg[])
格式的main
方法是否修復? 我們可以改變它嗎? 我們可以使用main
而不是public
,static
或void
? 如果沒有,爲什麼它不是硬編碼,main(String arg[])
將始終代表public static void main(String arg[])
?java中的public static void main(String arg [])是否被修復?
回答
主要方法的簽名在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
也是有效
我無法回答該方法的參數,但它必須是公開的,因爲jvm必須能夠訪問該函數並且它必須是靜態的,因爲jvm不知道如何創建你的類的實例。
這篇文章提供了關於推理靜態的好詳細的解答:Why is the Java main method static?
這篇文章提供了爲什麼主要是無效的一個很好的答案:Why is main() in java void?
你可以,如果你創建了一個新的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。
您確定嗎?我的熱點源代碼有硬編碼:'(* env) - > GetStaticMethodID(env,mainClass,「main」, 「([Ljava/lang/String;)V」);' – Voo 2012-04-05 12:41:58
不是在語言規範中定義的,只有按照定義實施才能保證工作。任何不符合規格的東西都不能保證正常工作。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.1.4 – Matteo 2012-04-05 12:45:04
當然是,請檢查啓動器的源代碼。 https://gist.github.com/2310831#L465 – 2012-04-05 12:50:21
如果你看看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;
...
它變得非常清楚,它必須只有這個簽名。
公共主()必須通過的任一個一起使用的方法的類的外部以及所述類內部,從而它的公共
靜態靜電是必要bcoz在Java如果我們定義類比我們爲該類定義的對象,並且只有比我們可以使用該類...而不是我們直接使用寫入單詞靜態
void-for main()不能返回任何值,如int或char main() - main是我們可以用來訪問java的未來的函數或方法 字符串在Java中所有我們寫考慮作爲一個字符串 ARGS論點
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
公開是一種訪問符由於我們可以從類的外部訪問。由於main是充當執行點的函數。主函數由類之外的JVM調用,因此它必須聲明爲public。
static是java中用來指定不需要創建任何實例的關鍵字。正如我們所知,main方法也駐留在類中,並且從類外部訪問類的特定功能(在這種情況下來自JVM),因此需要該特定類的實例,因此爲了避免這些,我們只需將靜態訪問課堂外的主要方法。
Void是返回類型,因爲main方法中的其他返回類型是無意義的。
字符串是java中的預定義類名。而args []是數組類型的變量。它是一個String類型對象的變量名稱。所以我們也可以改變args []的名字。字符串類及其對象可以作爲參數在正在運行的程序中傳遞,以便將信息從命令行傳遞給主方法。
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'。
- 1. public static void main(String [] args)和public static void main(String args [])之間的區別?
- 2. `public static <T> void main(String [] args)`代表什麼?
- 3. 我還是不明白public static void main(string [] args)
- 4. 我們可以使用public static void main(String [] [] args)嗎?
- 5. 爲什麼要在public static void main(String [] args)上拋出異常?
- 6. 錯誤:請定義主要方法爲:public static void main(String [] args)
- 7. 在Servlet中使用的Websocket,是「public static void main(final String [] args)」需要嗎?
- 8. 使用int而不是字符串:public static void main(int [] args)
- 9. 試圖在程序中新建一個ContextFactory> public static void Main
- 10. public static void <callbackMethodName>(IAsyncResult)
- 11. 替換數組項,源值也被替換爲public static void
- 12. 爲什麼我無法從public static void main更改JLabel中的文本?
- 13. 編寫一個沒有「public static void main」的JMS發佈服務器
- 14. Java:什麼是 - public static <T> foo(){...}?
- 15. public vs public static方法
- 16. 爲什麼public static final string不能用在java開關
- 17. 差分<p>我想知道在主要方法<code>String[]</code>和<code>String</code>之間的差</p> <pre><code>public static void main(String[] args) { </code></pre> <p>VS</p> <pre><code>public static void main(String args) { </code></pre>
- 18. 這是什麼語法 - public static 9000?
- 19. 如何調用public void protected void
- 20. Java課程:public void displayMessage()不工作
- 21. Java中的未聲明類是否爲public?
- 22. 什麼是錯誤的void main()?
- 23. public void paintComponent(Graphics g)not working
- 24. main(String args [])和main(String [] args)之間有區別嗎?
- 25. public interface inf1 {void show(); } public interface inf2 {void show(); }公共類A:INF1:INF 2 {}
- 26. static final String或strings.xml
- 27. C中的void和static void函數有什麼區別?
- 28. Main類中的「string [] args」是什麼?
- 29. 在D中使用`void main`
- 30. 「在Java中將」frame「的修改器更改爲」static「」
你可以很容易地創建一個新的啓動器,它可以以不同的方式完成,方法不必是公開的(JNI接口允許你調用任何**方法),它不一定是靜態的,JNI接口可以通過調用它的構造函數再次創建任何對象**,然後調用實例方法。 – 2012-04-05 12:53:36
@MaurícioLinhares我完全知道我可以打電話給我想要的任何東西,但不能保證它能正常工作。一個JVM(還有其他JVM也不是來自Oracle)只是被迫遵循規範。他們可能只是產生一個錯誤,並告訴你「沒有辦法,即使技術上可行,也不是標準的」。規範被稱爲規範的原因。 – Matteo 2012-04-05 12:56:42
**不能保證它會工作**?你是什麼意思?我的個人發射器無法工作,因爲規範說明了嗎?任何啓動程序**都可以工作**只要所啓動的類符合標準,請檢查其他答案和源代碼示例。 – 2012-04-05 12:58:37