為什么Java的main方法必須是public static void?


一、 void

  如下,C, C++一樣,將返回值類型改為int,再返回一個0,雖然編譯通過,但是運行時會報錯。

 

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

  一個方法的執行,如果在返回一個值之外還導致某些外部“狀態”發生變化,則稱該方法產生了副作用。這里所謂“狀態”發生變化,可以是實例域或靜態變量被修改。

  1. 沒有返回值的方法必有副作用,除非它的方法體是空的或者方法沒有意義。所以,沒有返回值的方法、有返回值但有副作用的方法稱為過程;
  2. 有返回值而且沒有副作用的方法稱為函數(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關鍵字

 

  2public關鍵字改為protected

 

  3、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 最終的到了解決。(https://www.cnblogs.com/liutaoblogs/p/6542628.html

 

三、 static

 

  在C語言中,所有的函數都可以被直接調用,main函數相當於全局函數,但在Java中一般先要創建一個類的對象,再通過對象調用函數,但是在執行main函數之前創建一個對象顯然是不可能的,因為JVM規定main函數為入口函數,從main開始執行static關鍵字就解決了這個問題,static關鍵字修飾的方法可以視為類方法,不需要創建對象就可以直接調用該方法。

 

四、 main方法重載

  main函數也可以重載,只要滿足重載的條件即可。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM