1、 voidhtml
以下,像C, C++同樣,將返回值類型改成int,再返回一個0,雖然編譯經過,可是運行時會報錯。java
找到一種可理解的解釋:方法的反作用和返回值類型。(http://www.cnblogs.com/huanmin/p/6429778.html)程序員
一個方法的執行,若是在返回一個值以外還致使某些外部「狀態」發生變化,則稱該方法產生了反作用。這裏所謂「狀態」發生變化,能夠是實例域或靜態變量被修改。函數
因爲Java的主函數是棧中最底層的函數,因此並不存在可以接收的值(沒有誰能接收main的返回值),因此使用void。spa
但是爲何Java不能像C, C++那樣返回int型值?操作系統
找到描述C語言的main函數的調用過程:首先,咱們的程序進入到入口函數以前,是發生了不少事情的。操做系統的安排,啓動運行時庫,運行時庫再初始化好環境,而後啓動你的入口函數,你的程序才正常的運行起來。等你的程序運行結束後,就退回到運行時庫,而後再退回到操做系統,而後系統再調度其餘程序執行。(https://www.cnblogs.com/deanyuton/p/8227733.html).net
由於main()不是由操做系統直接調用,因此返回類型不同也是能夠理解的。能夠認爲運行時庫就是操做系統和main函數的中間聯繫人,在C語言中由運行時庫直接調用main函數,因此main函數的返回值也是運行時庫接收。在Java中,能夠認爲是操做系統→JVM→main函數這樣的調用過程,JVM直接調用main函數,因此若是main函數有返回值,即JVM接收。可是JVM被設計爲不接受任何返回值,因此main函數不能有返回值,只能void。設計
可是JVM爲何不接受返回值?htm
http://www.javashuo.com/article/p-ttsuzfnp-nh.html(裝載JVM)對象
https://www.cnblogs.com/iceAeterNa/p/4876940.html (深刻虛擬機)
2、 public
一、去掉public關鍵字
2、public關鍵字改成protected
三、public改成private
編譯警告:The method main(String[]) from the type TestMain is never used locally
public是函數的權限,決定了是否能夠被外部函數調用,若是改成private,則只能是該main函數所在類的方法能夠調用,在其餘類中不可見,protected規定子類和同一個包類可用,可是調用main函數的函數所在包和main函數所在包確定不在同一個包內,因此必須是public。C裏面的函數是運行在操做系統環境中的,注意是運行時庫調用main函數,可是整個C代碼及運行時庫都直接在操做系統中運行,可是Java的代碼是運行在JVM中的,若是不限定public,JVM就沒法調用main函數。(https://blog.csdn.net/echostream/article/details/44039169)
可是在Java SE1.4之前是不強制main函數爲public的。當main方法不是public時,有些版本的java解釋器也能夠執行java應用程序。有個程序員報告了這個bug. 若是感興趣能夠查一下這個bug號碼4252539.這個bug被標明「關閉」,不予修復。Sun公司的工程師解釋說:java虛擬規範並無要求main方法必定是public。 好在,這個問題在 java SE1.4及之後的版本中強制main方法是public 最終的到了解決。(http://www.javashuo.com/article/p-uokhlhzh-nh.html)
3、 static
在C語言中,全部的函數均可以被直接調用,main函數至關於全局函數,但在Java中通常先要建立一個類的對象,再經過對象調用函數,可是在執行main函數以前建立一個對象顯然是不可能的,由於JVM規定main函數爲入口函數,從main開始執行。static關鍵字就解決了這個問題,static關鍵字修飾的方法能夠視爲類方法,不須要建立對象就能夠直接調用該方法。
4、 main方法重載
main函數也能夠重載,只要知足重載的條件便可。