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

时间:2018-12-21 20:06:56

标签: java jvm javac jit

我们知道,如果要创建object中的class,我们需要做一些事情:

class MyClass{
// ...
}

要创建其object,请执行以下操作:

MyClass MyObj = new MyClass();

现在,如果要使用Java创建程序,则需要在main内有一个class方法,并且class应该与文件名相同。

例如:

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

现在的问题是,当程序运行时,MyFile类的对象是否也将由java在内部创建,以便通过调用{{1}开始执行Java文件}方法还是以如下方式静态调用main方法:

main

如果我将MyFile.main(String[] args); 类中的类设为:

MyFile

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

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在此类情况下将执行哪些操作,以便既可以借助java方法来运行程序,又可以在{{1}之前和之后加载其他内容} 方法?在这种情况下,main内部将执行哪些操作?

2 个答案:

答案 0 :(得分:8)

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

该类已被初始化,因此,如果您有静态初始化程序,则那个将在main方法之前执行,但该类的任何实例都不会被建造。不需要这样做,这会带来不必要的复杂性。 (例如,如果仅在构造函数中包含参数,您会期望发生什么?)

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

答案 1 :(得分:1)

除了Jon Skeet's answer之外,我们还可以使用一个代码示例来证明在调用main方法时未创建封闭类的实例:

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

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

该程序的输出很简单:

Test

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