【问题标题】:Java Instance Initialization Block and instance variablesJava 实例初始化块和实例变量
【发布时间】:2014-09-14 08:37:35
【问题描述】:

在我之前的问题Java classes and static blocks 的上下文中,如果我将代码从静态块和变量更改为普通的实例初始化块和实例变量会怎样。现在代码将如何执行?

class extra3 {
    public static void main(String string[]) {
        Hello123 h = new Hello123();
        System.out.println(h.a);
    }
}
class Hello123 {
    {
        a=20;
    }
    int a=158;
}

在这里我得到的输出为 158。我无法理解这里的原因。其他代码是这样的:

class extra3 {
    public static void main(String string[]) {
        Hello123 h = new Hello123();
        System.out.println(h.a);
    }
}
class Hello123 {
    int a=158;
    {
        a=20;
    }
}

这里的输出是 20,这是可以接受的,因为创建对象时首先执行实例块。但是为什么第一个代码的输出是 158 呢?

【问题讨论】:

  • 我所看到的,代码是串行执行的,应该是这样的。

标签: java instance-variables initialization-block


【解决方案1】:

这是初始化的顺序

  1. 将字段设置为默认初始值(0、false、null)
  2. 为对象调用构造函数(但不要执行构造函数的主体)
  3. 调用超类的构造函数
  4. 使用初始化器和初始化块初始化字段
  5. 执行构造函数的主体

因此,当您初始化字段时,内联初始化程序 (a = 158) 和初始化块 (a = 20) 都会按照它们定义的顺序执行。

所以在第一种情况下,内联初始化器在初始化块之后执行,结果是 158。

在第二种情况下,初始化块在内联初始化程序之后执行。

【讨论】:

  • 非常感谢。很好的解释。
  • 我还有 1 个疑问。为什么在实例块中设置'a'时肯定没有声明'a'时编译'a'
  • @ShashankAgarwal :我不明白你的问题
  • @ShashankAgarwal - 'a' 编译正确,因为在调用构造函数时,实例变量在步骤 1 本身中设置为默认值。请参阅“接受的答案”排序。 'a' 在示例 1 中设置为 0,然后设置为 20,然后设置为 158
【解决方案2】:

订单很重要。

初始化和静态块根据它们在源代码中放置的顺序执行。就是这个原因。

【讨论】:

    【解决方案3】:

    静态块按照它们在代码中声明的顺序执行。 This文章将帮助您了解静态和非静态初始化块的执行顺序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 2016-02-13
      • 2011-03-18
      • 2010-11-26
      • 1970-01-01
      相关资源
      最近更新 更多