相信很多人在運行第一個可以運行的 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
但是編譯是不會有錯誤的。