java中main方法前的public static void及其后面的(String[] args)【笔记自用】
為什么Java的main方法必須是public static void?
一、 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
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函數也可以重載,只要滿足重載的條件即可。
Java中main方法參數String[ ] args的使用。
我們剛開始學習java時都會被要求記住主方法(main)的寫法,就像這樣:
1 public static void main(String[] args){ } 2 public static void main(String args[]){ } //兩種寫法都是一樣的,都表示字符串數組args,其中args只是普通變量名,可以隨意定義(前提是符合變量名規則)為什么一定要這么寫?是java規定的(具體的意義我不知道),main方法參數必須為字符串數組(String [ ]),變量名可以隨意,通常使用args即是arguments(”參數“的復數形式)的縮寫。
如果我們就是不呢?那就不能被系統識別為主方法,例如這樣:
在Eclipse運行結果:
如果在已經有正確main方法,再有同名的main方法就是方法重載了:
回歸正題:
== 參數String[ ] args的作用就是可以在main方法運行前將參數傳入main方法中。==
1)從控制臺,輸入編譯執行命令時傳參數。例如下面代碼:
1 public static void main(String[] args){ 2 for(int i=0; i<args.length; i++) 3 System.out.println(args[i]); //遍歷輸出args[]中元素 4 }但是此時args[]并沒有賦值,我們需要從控制臺命令行進行賦值,就像這樣:
所以在命令行中使用String[ ] args即傳入參數的使用為:java 類名 【參數1】 【參數2】 【參數3】 .。。。
2)在Eclipse使用String[ ] args。
鼠標右鍵點擊程序
出現以下窗口,切換到(x)=Arguments窗口,輸入參數
最后點擊Run運行即可。
總結
以上是生活随笔為你收集整理的java中main方法前的public static void及其后面的(String[] args)【笔记自用】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pipfile和pipfile.lock
- 下一篇: java中system.out.prin