【问题标题】:How object creation or constructors called implicitly in Java在 Java 中如何隐式调用对象创建或构造函数
【发布时间】:2016-04-26 14:42:04
【问题描述】:

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

但我对构造函数有点困惑。

【问题讨论】:

  • new 运算符在调用该对象的构造函数之前创建对象。因此,构造函数在现有对象上执行,而不是在任何类上静态执行。
  • @AndreasFester 那么为什么大多数人说我们通过这个new Object();调用构造函数@
  • 但这就是我所说的 - 您可以将对象创建视为由new 执行的两步过程。请参阅@PeterLawrey 的答案。
  • @LetDoit 它被称为构造函数。

标签: java constructor


【解决方案1】:

在字节码中,您的 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>
...

【讨论】:

  • 您还可以看到构造函数具有内部签名&lt;init&gt;,返回类型为void。 +1
  • @LetDoit 使用 javap -c -v 大多数 IDE 都有字节码查看器。
【解决方案2】:

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

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

【讨论】:

  • An new object is created, but it is not inilialised. 在字节码中?对象已经创建?或者当我们打电话给new 时?
  • 是的,不,是的。当我们使用new时,它会创建一个新对象,对象创建完成后,会在构造函数中初始化。
  • 外部类是隐式静态的吗?
  • @LetDoit 外部类隐含地没有更外部类作为内部类。
  • 那不知道为什么人们给这个答案+4。 stackoverflow.com/a/18738063/2769917他明确提到的地方。那An outer class is already implicitly static.
猜你喜欢
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 2013-09-24
  • 2019-07-25
  • 1970-01-01
相关资源
最近更新 更多