Java实例初始化块和实例变量

时间:2014-07-23 08:42:18

标签: java instance-variables initialization-block

在上一个问题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?

3 个答案:

答案 0 :(得分:4)

这是初始化的顺序

  1. 将字段设置为默认初始值(0,false,null)
  2. 调用对象的构造函数(但不要执行构造函数的主体)
  3. 调用超类的构造函数
  4. 使用初始值设定项和初始化块初始化字段
  5. 执行构造函数的主体
  6. 因此,在初始化字段时,内联初始值设定项(a = 158)和初始化块(a = 20)将按照已定义的顺序执行。

    因此,在第一种情况下,在初始化块之后执行内联初始化程序,结果会得到158.

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

答案 1 :(得分:1)

订单很重要。

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

答案 2 :(得分:1)

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