非静态初始化程序块 - 我是否有更多控制权?

时间:2016-04-07 00:49:34

标签: java

我仍处于Java的学习曲线上。为了理解更多初始化块,我创建了一个小测试类:

public class Script {

    {
        Gadgets.log("anonymous 1");
    }

    public Script() {
        Gadgets.log("constructor");
    }

    {
        Gadgets.log("anonymous 2");
    }
}

当我创建一个实例时,我得到了这个日志:

Script: anonymous 1
Script: anonymous 2
Script: constructor

这告诉我,两个初始化程序块都在构造函数之前运行,按它们在源代码中出现的顺序运行(与静态初始化程序相同)。 我想知道的是:我对这种行为有更多的控制吗? 因为Java Documentation说(source):

  

实例变量的初始化块看起来就像静态   初始化块,但没有static关键字:

{
     // whatever code is needed for initialization goes here 
}
  

Java编译器将初始化程序块复制到每个构造函数中。因此,   这种方法可用于在多个之间共享代码块   构造

那究竟是什么"将初始化程序块复制到每个构造函数中#34;意思?根据我的日志,似乎,它们被复制到每个构造函数的开头。这是对的吗?

如果将它们复制到每个构造函数的END(这是我在匿名2中所期望的那样),那么在多个构造函数之间共享这些块也会非常有意义。 有没有办法控制那些块更多或是我唯一的选择"经典"如果我想在每个构造函数的 end 执行常见任务,那么编写一个在每个构造函数中调用的命名方法的方法?

1 个答案:

答案 0 :(得分:11)

构造函数按以下顺序执行:

  1. super()致电,隐式或明确。
  2. 变量初始值设定项和初始化程序块,按照它们在源代码中出现的顺序。
  3. 构造函数的剩余部分。
  4. 这在JLS中指定,不能更改。

    如果存在this()来电,则会替换(1)和(2)。