当前位置: 首页 > 面试题库 >

实例变量何时被初始化并分配值?

宋伯寅
2023-03-14
问题内容

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

考虑以下示例:

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();

}
}

家长建设者

子init()

父Init()

儿童构造者

属性1:100

属性2:null

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

  2. 好奇地知道为什么属性2为NULL?

  3. 有设计上的缺陷吗?


问题答案:

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

整个对象的内存是在new调用java.lang.Object构造函数之前在调用运算符时分配的。在中为单个Integer实例分配了内存init,但是为单个属性分配内存(仅对整个对象)毫无意义。

好奇地知道为什么属性2为NULL?

init在super构造函数中调用该方法,然后对其进行attribute2分配new Integer(200),然后调用子类构造函数,该子类将按属性初始化程序在源代码中出现的顺序应用属性。这条线

private Integer attribute2 = null;

覆盖分配init()给的值null

如果您添加呼叫

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

在您致电super();之后,这将变得显而易见。

有设计上的缺陷吗?

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

init由于C 在输入构造函数时会重写vtable指针,因此这也可能会使C 程序员等人感到困惑,他们希望从基类进行调用以调用基类的版本。

有关所有详细信息,请参见Java语言规范。



 类似资料:
  • 本文向大家介绍tensorflow 初始化未初始化的变量实例,包括了tensorflow 初始化未初始化的变量实例的使用技巧和注意事项,需要的朋友参考一下 今日在Stack Overflow上看到一个问如何只初始化未初始化的变量,有人提供了一个函数,特地粘贴过来共大家品鉴: 通过tf.global_variables()返回一个全局变量的列表global_vars, 然后以python列表解析式的

  • 我想了解各种情况下类实例的初始化 在JLS-7第12.5节中,没有提到如何以及何时初始化最终实例变量?如果实例变量被声明为final,是否有人能给我一点参考来理解其行为? 给出的输出如下 在哪里作为 是否将输出作为

  • 问题内容: 我刚刚创建了一个类,并给了它一些变量。不幸的是,我无法在中访问这些变量。但是,相同的语法也可以在游乐场中使用… 问题答案: 类声明 的语法为: 您的include 声明本身不是 声明 ,而是 声明 -特别是带有infix运算符的 二进制表达式 。

  • 问题内容: 这是一些示例代码, 输出:d.value()返回0 //我希望10是因为lookup()被覆盖,但不是0!有人可以澄清吗? 的实例变量的初始化在执行其查找方法时尚未发生。如何确保在调用其方法时初始化的实例变量? 问题答案: 首先,由于缺乏方法,该代码无法编译。 无论如何,我相信您的问题是,由于构造函数是分层运行的,您的期望是无效的。 超类的构造函数始终在子类的构造函数之前运行,这包括子

  • 问题内容: 在我的Android应用程序中,我有一个奇怪的错误。像下面这样的实例变量在运行时意外分配给它的默认值(在这种情况下为false)。何时在Android活动中初始化此类变量? 问题答案: 创建实例时,将初始化Java中的实例变量。 大多数情况下,对象会使用实例化。 对于活动,它们由Android框架使用反射实例化(请参阅参考资料)。然后执行的初始化,并在实例上调用活动。 有关详细信息,请

  • 问题内容: 我想知道静态变量何时初始化为其默认值。加载类时,先创建(分配)静态变量,然后执行静态初始化程序和声明中的初始化是否正确?在什么时候给出默认值?这导致前向参考的问题。 另外,如果你可以参考“ 为什么没有及时初始化静态字段?”这一问题进行解释,尤其是Kevin Brock在同一网站上给出的答案。我不明白第三点。 问题答案: 从请参阅Java静态变量方法: 它是一个属于类而不属于对象(实例)