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

2024-02-20

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

考虑这个例子:

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

OUTPUT:

父构造函数

子进程初始化()

父级初始化()

子构造函数

属性 1 : 100

属性 2:空


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

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

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


属性 1 和 2 的内存何时在堆中分配?

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

很想知道为什么属性 2 是 NULL ?

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

private Integer attribute2 = null;

覆盖分配的值init() to null.

如果您添加一个呼叫

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

在您致电后super();那么这就会变得明显。

是否存在任何设计缺陷?

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

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

See Java 语言规范 http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5对于所有血淋淋的细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实例变量何时初始化并赋值? 的相关文章

随机推荐

  • NodeJS:如何像C#一样生成Rfc2898DeriveBytes?

    我正在尝试使用 NodeJS 加密库和 C Rfc2898DeriveBytes 生成相同的密码哈希 使用 C 生成的 salt 时 NodeJs 实现不会生成相同的密钥 我究竟做错了什么 在 C 中 public static strin
  • symfony2 主义 onetoone 完整示例

    我尝试从示例中建立onetoone关系 http docs doctrine project org en latest tutorials composite primary keys html use case 2 simple dri
  • SQL Server 通知 - 我的 OnChange 不触发

    我想利用 SQL Server 通知来捕获 winforms 应用程序中数据库中的插入事件 我正在尝试使用 SQLDependency 对象 MSDN 文章使这看起来非常简单 所以我创建了一个小示例应用程序来尝试一下 该事件似乎仅在我第一次
  • HTML 表格列宽:固定宽度和可变宽度的结合

    我做了一个这样的表格 table style width 100 tr td aaa td td td td class fixed width bbb td td class fixed width ccc td tr table 我将如
  • Pycharm 中模板的自动完成功能

    每当我创建一个函数 将其设为视图并将模板映射到其上时 PyCharm 中的自动完成功能都会起作用 如果您输入类似的内容 book where book是一个模型 并且是您的上下文对象之一 那么它将为您提供一个包含可能完成的下拉菜单 但是 如
  • rand() 在 OS X Mavericks/XCode 5.1 上损坏? (或者,“这是一个巨大的安全漏洞,还是我只是一个糟糕的程序员?”)[重复]

    这个问题在这里已经有答案了 以下代码片段随机打乱 STL 整数数组 它在 Ubuntu 和 Red Hat 上都能正常工作 然而 在我的 Mac OS X 机器上 数组每次都会按照相同的顺序进行洗牌 代码的第二部分打印随机数生成器的输出 这
  • IronRuby 性能?

    虽然我知道 IronRuby 还没有准备好让全世界使用它 但我想知道这里是否有人尝试过它并测试它在原始性能方面与其他红宝石相比的表现如何 如果是这样 结果是什么 您是如何衡量性能的 哪些基准等 Edit IronRuby 团队维护了一个网站
  • 如何在剃刀代码块中插入空格?

    VS2013 MVC5 剃刀 VB 我希望 已答复 一词前面有空格 如何在以下 Razor 代码块中强制添加空格 Code If Model DisplayAnsweredFlag Then If Model Answered Then H
  • 将 python3.5 设置为 AWS 中的默认值?

    有没有办法让python3 5成为AWS中的默认python 每次我尝试下一次连接时 python2 7 是默认版本 pip 6 是最后一个版本 知道我在几分钟前更新了它 这是我遵循的方法 亚马逊 链接 http docs aws amaz
  • 了解 gsl::narrow 实现

    The C 核心指南 https github com isocpp CppCoreGuidelines blob master CppCoreGuidelines md has a narrow如果强制转换更改了值 则会抛出异常 看着微软
  • SELECT * 中有时会缺少计算列

    在 SQL Azure 中 我有一个或多或少像这样设置的表 其中有两个计算列 IsExpired and IsDeadlineExpired 简单地将不可为 null 的日期时间列与当前时间进行比较 CREATE TABLE dbo Stu
  • 带有预定义关键字参数的define_method

    我想定义一个采用关键字参数的方法 我希望它在未提供关键字参数时引发 并且我可以自己编写代码 但理想情况下我想让 Ruby 为我做这件事 另外我希望能够使用检查新定义的方法Method parameters 如果我使用速记 double sp
  • 覆盖rails update_all方法

    我需要覆盖轨道 活动记录 update all方法 以便它始终更新updated at场也是如此 我应该如何实现这一目标 将以下代码放入文件中 config initializers update all with touch rb cla
  • 将用户定义的库添加到 SVN

    我正在开发一个项目 我使用了许多外部库 jar 格式 我已将下载的所有外部 jar 添加到版本控制 subversion 的构建路径中 然而 最近我注意到许多库并不在 SVN 树中 我对此进行了一些研究 这些是我作为用户定义的库创建的库 并
  • 在函数中使用全局变量

    如何在函数内创建或使用全局变量 如何在一个函数中在其他函数中使用定义的全局变量 Failing to use the global keyword where appropriate often causes UnboundLocalErr
  • PostgreSQL 自定义异常?

    在 Firebird 中我们可以像这样声明自定义异常 CREATE EXCEPTION EXP CUSTOM 0 异常 自定义异常 这些存储在数据库级别 在存储过程中 我们可以像这样引发异常 异常 EXP CUSTOM 0 PostgreS
  • Cakephp - HABTM 记录不会在唯一设置为 true 时删除

    CakePHP 的默认值 unique 设置为 true 我对其进行编码也是为了确保这一点 所以我有以下数据库结构 项目 HABTM 操作 将 unique 设置为 true 情况如下 当我删除 1 条或多条记录时 如果至少 1 条记录保持
  • 有没有办法从 Java Play 2 框架中的数据库生成代码?

    有谁知道如何在 Play Framework 2 0 中轻松地从数据库生成代码 我知道他们有一个模块 但似乎这是 1 X 版本的 Anyone CRUD 模块仅适用于 Play 1 2 x 在 Play 2 0 中不可用 它可能会在 Pla
  • C++ 中的 exit 和 std::exit 有什么区别?

    有什么区别exit and std exit在 C 中 我已经研究过但我找不到任何东西 这两个代码有什么区别 1 if SDL Init SDL INIT EVERYTHING 0 std cout lt lt Error Can t in
  • 实例变量何时初始化并赋值?

    实例变量什么时候初始化 是在构造函数块完成之后还是之前 考虑这个例子 public abstract class Parent public Parent System out println Parent Constructor init