Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我用java非静态声明main,会发生什么_Java_Oop - Fatal编程技术网

如果我用java非静态声明main,会发生什么

如果我用java非静态声明main,会发生什么,java,oop,Java,Oop,我最近开始学习Java,我遇到的第一个疑问是main在Java中声明为静态,这样JVM就不必初始化类来访问main。但是我的问题是为什么JVM避免初始化具有main的类?如果我们将main声明为非静态,会产生什么成本?编译器会将其视为实例方法,也就是说,您将无法使用java类直接执行它 但是我的问题是为什么JVM避免初始化具有main的类 因为不需要初始化类,因为它不能成为应用程序的入口点。在运行时,JVM将检查是否存在公共静态void mainString[]args方法,如果存在,则将初始化

我最近开始学习Java,我遇到的第一个疑问是main在Java中声明为静态,这样JVM就不必初始化类来访问main。但是我的问题是为什么JVM避免初始化具有main的类?如果我们将main声明为非静态,会产生什么成本?

编译器会将其视为实例方法,也就是说,您将无法使用java类直接执行它

但是我的问题是为什么JVM避免初始化具有main的类

因为不需要初始化类,因为它不能成为应用程序的入口点。在运行时,JVM将检查是否存在公共静态void mainString[]args方法,如果存在,则将初始化该类,即执行其所有静态块,初始化其静态变量等等。但是,如果该类被视为无效的应用程序入口点,则操作将中断。

关键字static允许调用main,而无需实例化该类的特定实例。 这是必要的,因为JVM在创建任何对象之前调用main


如果没有入口点,如何执行?

引导类加载器在类文件中搜索主函数,如果主函数未声明为静态,则会出现错误,因为将函数声明为静态允许调用它,而无需实例化主函数所在的类文件

与使用static关键字一样,可以调用任何变量、方法或语句块,而无需创建声明它的类的任何对象或瞬间。这就是main被声明为静态的原因,这样就可以在不创建任何对象的情况下调用它。若它并没有声明为静态的,并且存在多个类,那个么JVM将如何知道实例化哪个类来调用main方法

但是我的问题是为什么JVM避免初始化具有main的类?如果我们将main声明为非静态,会产生什么成本;澄清Java在初始化和实例化类之间的区别可能很重要。在类装入器装入类之后,调用类的任何方法之前,该类只初始化一次;例如,初始值设定项为静态变量赋值。当创建新实例并运行其实例初始值设定项(即构造函数)时,该类将被实例化。