從寫java至今,寫的最多的可能就是主函數
public static void main(String[] args) {}
但是以前一直都沒有問自己,為什么要這么寫,因為在c語言中就沒有這樣子的要求。其實這是一個不需要解釋的問題,因為java標准就是這么規定的,那么既然是java標准規定的,我們按照規定來執行就好了。不過,這並不是一個很好的學習態度,如果總是知其然而不知其所以然,總會對java有種隔膜的感覺。就是發現問題了,不去解決,不去了解為什么,心里總是會有牽絆。今天既然自己都這么問自己了,為什么java的主函數要按照這個格式來寫,那么我就得弄明白為什么。
在java中,main()方法是java應用程序的入口方法。java虛擬機通過main方法找到需要啟動的運行程序,並且檢查main函數所在類是否被java虛擬機裝載。如果沒有裝載,那么就裝載該類,並且裝載所有相關的其他類。因此程序在運行的時候,第一個執行的方法就是main()方法。通常情況下, 如果要運行一個類的方法,必須首先實例化出來這個類的一個對象,然后通過"對象名.方法名()"的方式來運行方法,但是因為main是程序的入口,這時候還沒有實例化對象,因此將main方法聲明為static的,這樣這個方法就可以直接通過“類名.方法名()”的方式來調用。
實例
虛擬機通過調用某個指定類的方法main啟動,傳遞給main一個字符串數組參數,使指定的類被裝載,同時鏈接該類所使用的其它的類型,並且初始化它們。例如對於程序:
public class HelloApp { public static void main(String[] args) { System.out.println("Hello World!"); for (int i = 0; i < args.length; i++) { System.out.println(args); } } }
編譯后在命令行模式下鍵入: java HelloApp run virtual machine
將通過調用HelloApp的方法main來啟動java虛擬機,傳遞給main一個包含三個字符串"run"、"virtual"、"machine"的數組。現在我們略述虛擬機在執行HelloApp時可能采取的步驟。
開始試圖執行類HelloApp的main方法,發現該類並沒有被裝載,也就是說虛擬機當前不包含該類的二進制代表,於是虛擬機使用ClassLoader試圖尋找這樣的二進制代表。如果這個進程失敗,則拋出一個異常。類被裝載后同時在main方法被調用之前,必須對類HelloApp與其它類型進行鏈接然后初始化。鏈接包含三個階段:檢驗,准備和解析。檢驗檢查被裝載的主類的符號和語義,准備則創建類或接口的靜態域以及把這些域初始化為標准的默認值,解析負責檢查主類對其它類或接口的符號引用,在這一步它是可選的。類的初始化是對類中聲明的靜態初始化函數和靜態域的初始化構造方法的執行。一個類在初始化之前它的父類必須被初始化。整個過程如下: