如何在Java中隐式调用对象创建或构造函数

时间:2016-04-26 14:42:05

标签: java constructor

我对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;
}

但我对构造函数感到困惑。

2 个答案:

答案 0 :(得分:2)

构造函数不是静态的。它们是在您刚刚创建的实例上调用的。在字节码中会发生什么。

  1. 创建了一个新对象,但它没有被初始化。
  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>
...