编译器在实例化自己时如何处理 Main class
How does the compiler handle Main when instantiating own class
编辑:澄清:
创建一个包含 static main 的新 class。在 main 方法中实例化相同的 class。当 JVM 在实例化它时到达该 main 方法代码行时会做什么?
(JVM 是如何知道在 while 循环中 "skip over" 下面代码中的静态 main() 方法的)
我问是因为我看不到将 static main 放入您打算实例化的 class 中有任何好处,只将 static main 放入 [=28= 中似乎要好得多] class,专为启动应用程序而构建..
对狗感到困惑class:
public class Dog {
private int height;
public static void main (String[] args) { // <---- What does the JVM do when it reaches here during the object instantiation?
int i = 0;
Dog [] dogArray = new Dog[20];
while (i < 20){
dogArray[i] = new Dog(); // Instantiate knew class
dogArray[i].height = i*10; //whatever
i++;
}
}
}
当然创建两个 class 总是更好,在这种情况下:
public class Dog {
private int height;
getHeight{//etc...}
setHeight{//etc...}
}
public class launchApplication{
public static void main (String[] args) {
int i = 0;
Dog [] dogArray = new Dog[20];
while (i < 20){
dogArray[i] = new Dog(); // Instantiate knew class
dogArray[i].setHeight = i*10; //whatever
i++;
}
}
}
public class Test {
/**
* The constructor
*/
public Test() {
System.out.println("The is the constrcutor");
}
/**
* The main method
*
* @param args
*/
public static void main(String[] args) {
System.out.println("This is main");
new Test();
new Test();
new Test();
}
/**
* A static method
*/
public static void count() {
System.out.println("This is a static method");
}
/**
* A static block
*/
static {
System.out.println("This is the static block");
}
}
Output :
This is the static block
This is main
The is the constrcutor
The is the constrcutor
The is the constrcutor
运行 上面的代码,你会对此有更好的了解。
当您运行 程序时,jvm 会调用main
方法。为什么要在实例化 Test
class.
时调用它
当你实例化一个class时,首先会执行静态块。它将用于第一次实例化,而不是全部。 (查看输出)。
然后调用构造函数。
如果您查看输出,没有调用任何静态方法。静态方法只有在被调用时才会被调用。这就是 count()
在这种情况下不执行的原因。 main
方法被 JVM 调用一次,以启动程序,但之后它仍然是 class 的常规静态方法,它不会在调用时执行。
原来我正在寻找的答案(以及我想问的问题)实际上是 JVM 如何进行 bootstrapping 和调用 main。它是首先启动 JVM 的本机代码,并且使用 STATIC 调用 main 方法以避免必须先以某种方式(外部)创建一个对象,然后从该对象调用 main 方法。
我对 main 方法为什么是 "ignored" 的困惑是对 main 方法的调用方式的误解 - 它由 JVM 在其启动期间显式调用,这就是 JAVA 约定——JVM 就是这样构建和设计的,它是一种专用方法。
所以在我的例子中,main 作为一个方法,在 main 所属的 class 的每个实例化过程中都不会被调用(因为在实例化过程中不会隐式调用方法),我的印象是每当 class 由于它是 "the java main method" 而被实例化时, main 就会以某种方式自动调用 - 就好像它有一个要调用的钩子一样。关键在于掌握 STATIC 以及 JVM 如何加载 Main 方法而不首先实例化它的封闭 class 。这本质上是从 JVM(包括本机)bootstrap 过程到 运行 JAVA 应用程序的更 "purer" 面向对象的能力的过渡。
希望这是有道理的,并希望它可以帮助某人澄清一些事情。
编辑:澄清:
创建一个包含 static main 的新 class。在 main 方法中实例化相同的 class。当 JVM 在实例化它时到达该 main 方法代码行时会做什么?
(JVM 是如何知道在 while 循环中 "skip over" 下面代码中的静态 main() 方法的)
我问是因为我看不到将 static main 放入您打算实例化的 class 中有任何好处,只将 static main 放入 [=28= 中似乎要好得多] class,专为启动应用程序而构建..
对狗感到困惑class:
public class Dog {
private int height;
public static void main (String[] args) { // <---- What does the JVM do when it reaches here during the object instantiation?
int i = 0;
Dog [] dogArray = new Dog[20];
while (i < 20){
dogArray[i] = new Dog(); // Instantiate knew class
dogArray[i].height = i*10; //whatever
i++;
}
}
}
当然创建两个 class 总是更好,在这种情况下:
public class Dog {
private int height;
getHeight{//etc...}
setHeight{//etc...}
}
public class launchApplication{
public static void main (String[] args) {
int i = 0;
Dog [] dogArray = new Dog[20];
while (i < 20){
dogArray[i] = new Dog(); // Instantiate knew class
dogArray[i].setHeight = i*10; //whatever
i++;
}
}
}
public class Test {
/**
* The constructor
*/
public Test() {
System.out.println("The is the constrcutor");
}
/**
* The main method
*
* @param args
*/
public static void main(String[] args) {
System.out.println("This is main");
new Test();
new Test();
new Test();
}
/**
* A static method
*/
public static void count() {
System.out.println("This is a static method");
}
/**
* A static block
*/
static {
System.out.println("This is the static block");
}
}
Output :
This is the static block
This is main
The is the constrcutor
The is the constrcutor
The is the constrcutor
运行 上面的代码,你会对此有更好的了解。
当您运行 程序时,jvm 会调用main
方法。为什么要在实例化 Test
class.
当你实例化一个class时,首先会执行静态块。它将用于第一次实例化,而不是全部。 (查看输出)。
然后调用构造函数。
如果您查看输出,没有调用任何静态方法。静态方法只有在被调用时才会被调用。这就是 count()
在这种情况下不执行的原因。 main
方法被 JVM 调用一次,以启动程序,但之后它仍然是 class 的常规静态方法,它不会在调用时执行。
原来我正在寻找的答案(以及我想问的问题)实际上是 JVM 如何进行 bootstrapping 和调用 main。它是首先启动 JVM 的本机代码,并且使用 STATIC 调用 main 方法以避免必须先以某种方式(外部)创建一个对象,然后从该对象调用 main 方法。
我对 main 方法为什么是 "ignored" 的困惑是对 main 方法的调用方式的误解 - 它由 JVM 在其启动期间显式调用,这就是 JAVA 约定——JVM 就是这样构建和设计的,它是一种专用方法。
所以在我的例子中,main 作为一个方法,在 main 所属的 class 的每个实例化过程中都不会被调用(因为在实例化过程中不会隐式调用方法),我的印象是每当 class 由于它是 "the java main method" 而被实例化时, main 就会以某种方式自动调用 - 就好像它有一个要调用的钩子一样。关键在于掌握 STATIC 以及 JVM 如何加载 Main 方法而不首先实例化它的封闭 class 。这本质上是从 JVM(包括本机)bootstrap 过程到 运行 JAVA 应用程序的更 "purer" 面向对象的能力的过渡。
希望这是有道理的,并希望它可以帮助某人澄清一些事情。