java内部是否创建了持有main方法的类的对象?

Sta*_*low 2 java jit jvm javac

因为我们知道,如果我们要创建objectclass,我们需要做的是:

class MyClass{
// ...
}
Run Code Online (Sandbox Code Playgroud)

并创建它object我们做:

MyClass MyObj = new MyClass();
Run Code Online (Sandbox Code Playgroud)

现在,如果我们想在java中创建一个程序,我们需要在其中有一个main方法,class并且该方法class应该与文件名相同.

例如:

// file MyFile.java
public class MyFile{
    public static void main(String[] args){
      // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当该程序运行时,是否MyFile也会在内部创建类的对象,java以便通过调用main方法来启动java文件的执行,或者它是否main静态调用该方法:

MyFile.main(String[] args);
Run Code Online (Sandbox Code Playgroud)

如果我在课堂上有班级,那会是什么情况MyFile:

public class MyFile{

    class HelloWorld{
        // ...
    }

    public static void main(String[] args){
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

或者具有非静态属性和方法:

public class MyFile{

    int x = 10;

    public void MyWorld(){
        // ...
    }

    public static void main(String[] args){
        // ...
    }

    int y = 10;

    public void ByeWorld(){
        // ...
    }

}
Run Code Online (Sandbox Code Playgroud)

等等

现在,情景会怎样?会在java内部创建MyFile类的对象吗?java在这些类型的情况下将执行哪些操作以便在main方法的帮助下运行程序,以及在main方法之前和之后加载其他内容?java在这些情况下,内部采取的行动是什么?

Jon*_*eet 8

JVM启动时,不会自动创建该类的实例.该main方法只是静态调用 - 这就是为什么它必须首先是静态的.

这个类初始化,所以如果你有一个静态初始化,将在之前执行main的方法,但没有类的实例将建造.没有必要这样做,它会带来不必要的复杂性.(如果你只包含带参数的构造函数,你会发生什么?)

有关JVM启动的更多详细信息,请参阅Java语言规范的第12章.

  • @SunnyKhan访问类中的任何内容都需要先使用*classloader*加载*类,然后通过Java规范定义的详细过程.例如,在加载期间进行安全检查以验证类的完整性.然后执行静态初始化程序,如答案中所述.我怀疑你会通过了解课程加载过程来获得满足感. (3认同)