一、 void
如下,像C, C++一樣,將返回值類型改為int,再返回一個0,雖然編譯通過,但是運行時會報錯。
找到一種可理解的解釋:方法的副作用和返回值類型。(http://www.cnblogs.com/huanmin/p/6429778.html)
一個方法的執行,如果在返回一個值之外還導致某些外部“狀態”發生變化,則稱該方法產生了副作用。這里所謂“狀態”發生變化,可以是實例域或靜態變量被修改。
- 沒有返回值的方法必有副作用,除非它的方法體是空的或者方法沒有意義。所以,沒有返回值的方法、有返回值但有副作用的方法稱為過程;
- 有返回值而且沒有副作用的方法稱為函數(function)。
由於Java的主函數是棧中最底層的函數,所以並不存在能夠接收的值(沒有誰能接收main的返回值),所以使用void。
可是為什么Java不能像C, C++那樣返回int型值?
找到描述C語言的main函數的調用過程:首先,我們的程序進入到入口函數之前,是發生了很多事情的。操作系統的安排,啟動運行時庫,運行時庫再初始化好環境,然后啟動你的入口函數,你的程序才正常的運行起來。等你的程序運行結束后,就退回到運行時庫,然后再退回到操作系統,然后系統再調度其他程序執行。(https://www.cnblogs.com/deanyuton/p/8227733.html)
因為main()不是由操作系統直接調用,所以返回類型不一樣也是可以理解的。可以認為運行時庫就是操作系統和main函數的中間聯系人,在C語言中由運行時庫直接調用main函數,所以main函數的返回值也是運行時庫接收。在Java中,可以認為是操作系統→JVM→main函數這樣的調用過程,JVM直接調用main函數,所以如果main函數有返回值,即JVM接收。但是JVM被設計為不接受任何返回值,所以main函數不能有返回值,只能void。
但是JVM為什么不接受返回值?
https://www.cnblogs.com/mengfanrong/p/5225506.html(裝載JVM)
https://www.cnblogs.com/iceAeterNa/p/4876940.html (深入虛擬機)
二、 public
1、去掉public關鍵字
2、public關鍵字改為protected
3、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 最終的到了解決。(https://www.cnblogs.com/liutaoblogs/p/6542628.html)
三、 static
在C語言中,所有的函數都可以被直接調用,main函數相當於全局函數,但在Java中一般先要創建一個類的對象,再通過對象調用函數,但是在執行main函數之前創建一個對象顯然是不可能的,因為JVM規定main函數為入口函數,從main開始執行。static關鍵字就解決了這個問題,static關鍵字修飾的方法可以視為類方法,不需要創建對象就可以直接調用該方法。
四、 main方法重載
main函數也可以重載,只要滿足重載的條件即可。