让我们考虑以下代码:
package p;
public class Simple {
public static void main(String[] args){
System.out.println("HELLO!\n");
}
}
和它的JVM代码(javap -c Simple.class
):
Compiled from "Simple.java"
public class p.Simple {
public p.Simple();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String HELLO!\n
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
我有一个问题:
可能,入口点是main
函数。但是,在此之前,调用Simple类的构造函数是必要的。
那么它是怎样工作的?我的意思是,谁首先调用构造函数然后将控件传递给main
?
如果我错了,请向我解释控制流程的工作原理。
getstatic
之类的说明会使用#2
之类的参数。这是什么意思#2
?
评论如下:// Method java/lang/Object."<init>":()V
这是什么意思V
?
控制流程如何运作?
答案 0 :(得分:2)
PrintStream
上out
属性System
的引用。 Java编译器自动将import语句转换为完全限定的对象声明。 V
表示void
println
方法的入口点。#2意味着什么:
import java.util.List;
List x;
变得简单:
java.util.List x = new java.util.ArrayList();
当编译器生成字节码时。 java.lang
会自动导入。
答案 1 :(得分:0)
在这种情况下不调用构造函数,因为main()是静态的。
getstatic获取System.out静态字段的值
V表示void,即main()返回类型为void