gpt4 book ai didi

java - 实例变量何时初始化并赋值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:42:09 27 4
gpt4 key购买 nike

实例变量什么时候初始化?是在构造函数 block 完成之后还是之前?

考虑这个例子:

public abstract class Parent {

public Parent(){
System.out.println("Parent Constructor");
init();
}

public void init(){
System.out.println("parent Init()");
}
}

public class Child extends Parent {

private Integer attribute1;
private Integer attribute2 = null;

public Child(){
super();
System.out.println("Child Constructor");
}

public void init(){
System.out.println("Child init()");
super.init();
attribute1 = new Integer(100);
attribute2 = new Integer(200);
}

public void print(){
System.out.println("attribute 1 : " +attribute1);
System.out.println("attribute 2 : " +attribute2);
}
}

public class Tester {

public static void main(String[] args) {
Parent c = new Child();
((Child)c).print();

}
}

输出:

父构造函数

子初始化()

父初始化()

子构造函数

属性 1 : 100

属性 2:空


  1. 什么时候在堆中分配属性 1 和 2 的内存?

  2. 想知道为什么属性 2 为 NULL?

  3. 是否存在任何设计缺陷?

最佳答案

When the memory for the atribute 1 & 2 are allocated in the heap ?

java.lang.Object 构造函数进入之前调用 new 运算符时,整个对象的内存被分配。在 init 中为单个 Integer 实例分配内存,但是为单个属性分配内存是没有意义的——只有整个对象。

Curious to know why is attribute 2 is NULL ?

父类构造函数中调用了init方法,所以给attribute2赋值new Integer(200),然后是子类构造函数invoked 按照属性初始值设定项在源代码中出现的顺序应用它们。这条线

private Integer attribute2 = null;

init() 分配的值覆盖为 null

如果你添加一个电话给

 System.out.println("attribute 2 : " +attribute2);

在您调用 super(); 之后,这将变得很明显。

Are there any design flaws?

在基类完成初始化之前调用子类方法是危险的。子类可能依赖其基类的不变量来保护自己的不变量,如果基类构造函数尚未完成,则其不变量可能不成立。

这也可能会使 C++ 程序员和类似的人感到困惑,他们希望从基类调用 init 来调用基类的版本,因为 C++ 在输入构造函数时会重写 vtable 指针。

参见 The Java Language Specification对于所有血淋淋的细节。

关于java - 实例变量何时初始化并赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12308674/

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