java - 非静态初始化 block ——我有更多的控制权吗?

标签 java

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

public class Script {

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

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

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

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

Script: anonymous 1
Script: anonymous 2
Script: constructor

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

Initializer blocks for instance variables look just like static initializer blocks, but without the static keyword:

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

The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors.

那么“将初始化程序 block 复制到每个构造函数中”到底是什么意思呢?根据我的日志,它们似乎被复制到每个构造函数的开头。这样对吗?

如果将它们复制到每个构造函数的末尾(这是我在匿名 2 中所期望的),则在多个构造函数之间共享此类 block 也非常有意义。 有没有办法更多地控制这些 block ,或者我唯一的选择是编写命名方法的“经典”方法,如果我想在 end每个构造函数?

最佳答案

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

  1. super() 调用,隐式或显式。
  2. 变量初始化程序和初始化程序 block ,按照它们在源代码中出现的顺序排列。
  3. 构造函数的剩余部分。

这在 JLS 中指定并且不能更改。

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

关于java - 非静态初始化 block ——我有更多的控制权吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36464818/

相关文章:

java - 为什么我可以增加子类中重写方法的可见性,这不是安全风险吗?

java - 如何解析 HTML 并获取 CSS 样式

java - 将 JTable 格式化为文本文件中所示?

java - 当我在更新后选择 * 时,CrudRepository native 查询给出旧值

java - 圆弦的最佳方法

java - 是否可以使用 plafyramework2 for java 和 groovy 模板?

JavaFX 使用 SwingNode 嵌入 JFileChooser 并获取选定的文件

java - 做一个学校项目,无法正确计算面积

java - 虽然没有条件

java - 我如何在 JBoss 中禁用 RMI?