爲何Java的main方法必須是public static void?

1、 voidhtml

  以下,C, C++同樣,將返回值類型改成int,再返回一個0,雖然編譯經過,可是運行時會報錯。java

 

  找到一種可理解的解釋:方法的反作用和返回值類型。(http://www.cnblogs.com/huanmin/p/6429778.html)程序員

  一個方法的執行,若是在返回一個值以外還致使某些外部「狀態」發生變化,則稱該方法產生了反作用。這裏所謂「狀態」發生變化,能夠是實例域或靜態變量被修改。函數

  1. 沒有返回值的方法必有反作用,除非它的方法體是空的或者方法沒有意義。因此,沒有返回值的方法、有返回值但有反作用的方法稱爲過程;
  2. 有返回值並且沒有反作用的方法稱爲函數(function)。

  因爲Java的主函數是棧中最底層的函數,因此並不存在可以接收的值(沒有誰能接收main的返回值),因此使用voidspa

但是爲何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關鍵字

 

  2public關鍵字改成protected

 

  三、public改成private

 

  編譯警告The method main(String[]) from the type TestMain is never used locally

  public是函數的權限,決定了是否能夠被外部函數調用,若是改成private,則只能是該main函數所在類的方法能夠調用,在其餘類中不可見protected規定子類和同一個包類可用,可是調用main函數的函數所在包和main函數所在包確定不在同一個包內,因此必須是publicC裏面的函數是運行在操做系統環境中的,注意是運行時庫調用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函數也能夠重載,只要知足重載的條件便可。

 

相關文章
相關標籤/搜索