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

Gri*_*ram 7 java

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

public class Script {

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

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

    {
        Gadgets.log("anonymous 2");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Script: anonymous 1
Script: anonymous 2
Script: constructor
Run Code Online (Sandbox Code Playgroud)

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

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

{
     // whatever code is needed for initialization goes here 
}
Run Code Online (Sandbox Code Playgroud)

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

那么"将初始化程序块复制到每个构造函数中"究竟是什么意思呢?根据我的日志,看起来,它们是每个构造函数的开头复制.这是正确的吗?

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

use*_*421 11

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

  1. super() 呼叫,隐式或显式.
  2. 变量初始值设定项和初始化程序块,按它们在源代码中出现的顺序排列.
  3. 构造函数的剩余部分.

这在JLS中指定,不能更改.

如果存在this()呼叫,则替换(1)和(2).