Sta*_*low 2 java jit jvm javac
因为我们知道,如果我们要创建object的class,我们需要做的是:
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在这些情况下,内部采取的行动是什么?
JVM启动时,不会自动创建该类的实例.该main方法只是静态调用 - 这就是为什么它必须首先是静态的.
这个类初始化,所以如果你有一个静态初始化,这将在之前执行main的方法,但没有类的实例将建造.没有必要这样做,它会带来不必要的复杂性.(如果你只包含带参数的构造函数,你会发生什么?)
有关JVM启动的更多详细信息,请参阅Java语言规范的第12章.