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

Does java internally creates the object of the class which is holding the main method?

我们知道,如果我们想创建 classobject,我们需要做一些事情:

class MyClass{
// ...
}

为了创建它的 object 我们这样做:

MyClass MyObj = new MyClass();

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

例如:

// file MyFile.java
public class MyFile{
    public static void main(String[] args){
      // ...
    }
}

现在的问题是,MyFile class 的对象是否也会在这个程序 运行 开始执行时由 java 在内部创建java 文件通过调用 main 方法还是静态调用 main 方法作为:

MyFile.main(String[] args);

如果我在 MyFile class 中有 class(es) 会怎样:

public class MyFile{

    class HelloWorld{
        // ...
    }

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

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

public class MyFile{

    int x = 10;

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

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

    int y = 10;

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

}

等等等等

现在,情况会怎样? java 会在内部创建 MyFile class 的对象吗?为了在 main 方法的帮助下 运行 程序以及在 java 方法之前和之后加载其他东西,java 将在这些类型的情况下执行什么操作main 方法?在这些情况下,java 内部会执行什么操作?

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

class被初始化,所以如果你有静态初始化器,that会在[=]之前执行10=] 方法,但不会构造 class 的实例。没有必要这样做,而且会引入不必要的并发症。 (例如,如果只包含带参数的构造函数,您期望发生什么?)

有关 JVM 启动的更多详细信息,请参阅 chapter 12 of the Java Language Specification

除了之外,我们可以用一个代码示例来证明封闭class的一个实例是不是创建的,当main 方法被调用:

public class Test {
    public Test() {
        System.out.println("Test2");
    }

    public static void main(String[] args) {
       System.out.println("Test");
    }
}

这个程序的输出很简单:

Test

如果创建了一个实例,您也会看到 Test2 打印到控制台。