4

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

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?

4

3 回答 3

4

这是初始化的顺序

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

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

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

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

于 2014-07-23T08:46:19.367 回答
1

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

于 2014-07-23T08:46:25.797 回答
1

订单很重要。

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

于 2014-07-23T08:45:46.137 回答