为什么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方法抽离出来、创建一个启动类就好了