Java 非静态初始值设定项块-我有更多的控制吗?

Java 非静态初始值设定项块-我有更多的控制吗?,java,Java,我仍然在学习Java。为了进一步了解初始化程序块,我创建了一个小测试类: public class Script { { Gadgets.log("anonymous 1"); } public Script() { Gadgets.log("constructor"); } { Gadgets.log("anonymous 2"); } } 创建实例时,我会得到以下日志: Script: a

我仍然在学习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文档说():

实例变量的初始值设定项块看起来就像静态的 初始值设定项阻止,但不包含static关键字:

Java编译器将初始值设定项块复制到每个构造函数中。所以,, 这种方法可用于在多个服务器之间共享一块代码 构造器

那么,“将初始值设定项块复制到每个构造函数中”到底意味着什么呢?根据我的日志,它们似乎是在每个构造函数的开头复制的。是这样吗

如果将这些块复制到每个构造函数的末尾(这是我在anonymous 2中所期望的),那么在多个构造函数之间共享这些块也是非常有意义的。
如果我想在每个构造函数的末尾执行常见任务,是否有一种方法可以更有效地控制这些块,或者是我唯一的选择,即编写命名方法的“经典”方法,在每个构造函数中调用该方法?

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

  • super()
    调用,隐式或显式
  • 变量初始值设定项和初始值设定项块,按它们在源代码中出现的顺序排列
  • 构造函数的其余部分
  • 这是在中指定的,不能更改


    如果存在一个
    this()
    调用,它将替换(1)和(2)。

    在构造函数之前而不是之后复制代码有什么问题?我希望它们必须在构造函数中的代码之前执行,而不是在最后执行,因为构造函数完全可以依赖已经初始化的变量。实际上,初始化块被复制到构造函数中,并在
    super
    之后执行,但在其他构造函数体之前执行。您仍然需要构造函数,因为在初始化过程中可能需要传递一些值。我认为这两种方法都非常合理—开始和结束。在开始时初始化构造函数的内容,在结束时使用作为参数传递给构造函数的内容。非常感谢。在卖掉我的日志后,我希望我不能对这件事有更多的控制。现在我知道了。
    {
         // whatever code is needed for initialization goes here 
    }