gpt4 book ai didi

java - 默认变量的值与默认初始化

转载 作者:太空狗 更新时间:2023-10-29 22:33:41 25 4
gpt4 key购买 nike

我们都知道,根据 JLS7 p.4.12.5每个实例变量都使用默认值初始化。例如。 (1):

public class Test {
private Integer a; // == null
private int b; // == 0
private boolean c; // == false
}

但我一直认为,这样的类实现(2):

public class Test {
private Integer a = null;
private int b = 0;
private boolean c = false;
}

绝对等于示例 (1)。我预计,复杂的 Java 编译器会发现 (2) 中的所有这些初始化值都是多余的并忽略它们。

但是对于这两个类,我们突然有了两个不同的字节码。

例如(一):

   0:   aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return

例如(2):

   0:   aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: aconst_null
6: putfield #2; //Field a:Ljava/lang/Integer;
9: aload_0
10: iconst_0
11: putfield #3; //Field b:I
14: aload_0
15: iconst_0
16: putfield #4; //Field c:Z
19: return

问题是:为什么?但这是很明显需要优化的事情。这是什么原因?

UPD:我使用 Java 7 1.7.0.11 x64,没有特殊的 javac 选项

最佳答案

不,它们不等价。在对象实例化时立即分配默认值。字段初始值设定项中的赋值发生在调用父类(super class)构造函数时...这意味着您可以在某些情况下看到差异。示例代码:

class Superclass {
public Superclass() {
someMethod();
}

void someMethod() {}
}

class Subclass extends Superclass {
private int explicit = 0;
private int implicit;

public Subclass() {
System.out.println("explicit: " + explicit);
System.out.println("implicit: " + implicit);
}

@Override void someMethod() {
explicit = 5;
implicit = 5;
}
}

public class Test {
public static void main(String[] args) {
new Subclass();
}
}

输出:

explicit: 0
implicit: 5

在这里您可以看到,在 Superclass 构造函数完成之后但在子类构造函数 body 之前,显式字段初始化将 explicit 的值“重置”回 0 执行。 implicit 的值仍然具有在 Superclass 构造函数对 someMethod 的多态调用中分配的值。

关于java - 默认变量的值与默认初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14663859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com