為什么java的main方法必須是靜態的
這個是我最近編程想到的問題,查了一些資料,這里總結一下。
來源:https://www.cnblogs.com/numen-fan/p/7163745.html
- 從Java程序運行的角度來說,在java程序運行的時候,JVM會去這個類對應的class文件中查找public static void main (String[] args) 進行運行,main方法的運行是由一個特定的線程main進行的,程序會一直運行直到main線程結束或者non-daemon線程終止。所以,當你看到“Exception in Thread main”如:Excpetion in Thread main:Java.lang.NullPointedException,意味着異常來自於main線程。如果找不到main方法的話,它就會拋出NoSuchMethodError:main異常,並停止執行。
- 但是程序運行角度只是表明,更深層次來說,正因為main方法是靜態的,JVM調用這個方法就不需要創建任何包含這個main方法的實例,否則由於創建main類的實例時,構造器可以被重載,JVM就沒法確定先調用哪個方法。
此外,由於main方法是公共的,也就是我們要作為類方法進行調用的,所以要設置為public。又因為main方法的返回值沒有意義,所以設置為void.
正是因為main方法是靜態的,所以所有它直接調用的方法也必須是靜態的,相應的,這些方法中使用的變量也要是靜態變量。而“類的靜態成員變量必須初始化,全局靜態變量如果沒有初始化會初始為0,函數中的靜態變量會在第一次運行函數時初始,而且僅初始一次”,所以就要求我們必須進行變量的初始化。
如果要使用非靜態方法或者非靜態變量怎么辦?把main方法抽離出來、創建一個啟動類就好了