繁体   English   中英

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

[英]How object creation or constructors called implicitly in Java

我对Java中的static methods和对象创建感到困惑。

如我们所知,我们可以按此处的静态方法访问静态成员。

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

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

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

  1. 创建了一个新对象,但是它没有被初始化。
  2. 在该对象上调用构造函数。 在构造函数中, this是要初始化的对象。

在字节码中,您的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虚拟机规范中也对此进行了指定:

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> ... 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM