我对static methods
和java中的对象创建感到困惑。
我们知道我们可以在静态方法中访问静态成员。
public static void main(String[] args){
// only static method from outside ( without any object )
}
但我的愚蠢问题是为什么java允许这个?
`public static void main(String[] args){
Object o = new Object(); // is constructor implicitly static?
// I'm sure no but why java allow this to call here?
}
我知道上面的语句类似于静态方法中声明局部变量。
public static void main(String[] args){
int a = 3;
}
但我对构造函数感到困惑。
答案 0 :(得分:2)
构造函数不是静态的。它们是在您刚刚创建的实例上调用的。在字节码中会发生什么。
this
中是要初始化的对象。答案 1 :(得分:2)
在字节码中,您的main()
方法看起来像这样(javap -c Main.class
命令的结果):
public static void main(java.lang.String[]);
Code:
0: new #3 // class java/lang/Object
3: dup
4: invokespecial #8 // Method java/lang/Object."<init>":()V
7: astore_1
8: return
如您所见,在位置0处,执行new
指令。然后,在位置4,在新创建的对象上调用构造函数。
这也在Java Virtual Machine Specification:
中指定<强> 4.10.2.4。实例初始化方法和新创建的对象
创建新的类实例是一个多步骤的过程。声明:
... new myClass(i, j, k); ...
可以通过以下方式实现:
... new #1 // Allocate uninitialized space for myClass dup // Duplicate object on the operand stack iload_1 // Push i iload_2 // Push j iload_3 // Push k invokespecial #5 // Invoke myClass.<init> ...