gpt4 book ai didi

java - 为什么实例字段的值变为空?

转载 作者:行者123 更新时间:2023-11-29 07:38:35 25 4
gpt4 key购买 nike

我有这段简单的代码。

abstract class X {
X() {
read();
}

private void read() {
Object obj = new Object();
readValue(obj);
}
protected abstract void readValue(Object obj);
}

class Y extends X {

Object obj = null;
Y() {
super();
}

@Override
protected void readValue(Object obj) {
this.obj = obj;
}

void printer() {
System.out.println("Object = " + obj);
}
}

class Runner {
public static void main(String[] args) {
Y y = new Y();
y.printer();
}
}

当我运行上面的代码时,对象被打印为 null。 (我得到“Object = null”)
令人惊讶的是,在 Y 类中,当我删除 null 声明时

Object obj;

打印对象的实际值。
类似于 ("Object = java.lang.Object@3cd1a2f1")
为什么会观察到这种行为? “这个”指的是什么?如果我们只是声明任何对象,它都会被 null 初始化,那么为什么会出现这种异常行为?

最佳答案

obj 字段为空的原因是 Y 的构造函数调用中发生的步骤顺序:

  1. Y 的构造函数调用最终调用具体类YreadValue 的 super 构造函数,因此将非空值赋给obj 字段。
  2. super 构造函数完成后,实例字段obj由于变量初始化器被初始化为null:

    Object obj = null;

当您删除 null 初始值设定项时,它变成了一个简单的字段声明,没有要在步骤 2 中执行的实例初始化。

恰当的解决方案不是删除null 初始化器,而是重新设计整个类层次结构。例如,由于 readValue 的目的似乎只是一个变量的 setter,那么你不需要让它重写父类中的抽象方法。只需将它设置为一个单独的方法,并在 Y 的构造函数完成后调用它。

关于java - 为什么实例字段的值变为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32770653/

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