相信很多人在運行第一個可以運行的 Java 程序的時候都會要求寫一個主函數。
然后很多人都會照葫蘆畫瓢的寫一個下面的函數:
public static void main(String[] args) { }
IJ 甚至非常貼心的給你 main 的代碼提示:
這個函數里面有幾個定義和關鍵字,估計可能會有些繞,和為什么這么寫?
近期在學習的時候才翻出來再看看,其中可能比較難理解的是關鍵字 static
public
這個關鍵字在這個函數中很好理解,就是表示這個函數是可以被其他類訪問到。
void
表示這個函數不返回任何數據。
這個也比較好理解,因為這個函數是主程序的入口,通常是不需要返回結果的。使用 void 也沒關系。
String[] args
這個表示的是這個函數可以從執行的時候獲得的輸入參數。
就是告訴這個函數在執行的時候,你可以在命令行中定義一些參數,然后這個函數通過獲得這些參數來對運行進行調整。
通常我們對輸入參數的控制會使用。
Apache 的 commons-cli-1.4.jar 來進行處理,因為這個 API 幫我解決了對出入參數進行處理的常用方法,能夠簡化我們的操作。
這個內容我們在其他地方再單獨拿出來說。
static
這個就是我們需要說明一下的重點了。
我們都知道 static 是表示靜態的意思,為什么在 main 函數里面需要靜態關鍵字修飾?
static 主要用途是告訴編譯器 main 函數是一個靜態函數。同時也就是說main 函數中的代碼是存儲在靜態存儲區的,即當定義了類以后這段代碼就已經存在了。
這個所謂的靜態存儲區,就是我們常說 JVM 中的堆(Heap),這個 Heap 就是 JVM 垃圾回收管理的區域,也是你經常看到內存溢出的區域。
static關鍵字主要用於內存管理。我們可以應用 ava static關鍵字在變量,方法,塊和嵌套類中。 static關鍵字屬於類,而不是類的實例。
被 static 關鍵字修飾的不需要創建對象去調用,直接根據類名就可以去訪問。
在 main() 方法中使用靜態(static)這個關鍵字,JVM 將會為這個方法開辟內存空間,你不需要對這個方法進行實例化,因此能夠節省不必要的開銷。
如果 main 方法不聲明為靜態的,JVM 就必須創建main類的實例,因為構造器可以被重載,JVM就沒法確定調用哪個 main 方法。
因此,在這里這個 static 關鍵字是必須要有的,否則你的程序可以編譯,但是無法運行。
如果使用上面的代碼:
public void main(String[] args) { System.out.println("RUN"); }
運行的時候將會有錯誤:
Error: Main method is not static in class com.ossez.codebank.algorithm.Main, please define the main method as: public static void main(String[] args) Process finished with exit code 1
但是編譯是不會有錯誤的。


