在Java中,为什么有一个没有关键字的代码块,只有大括号

2022-09-02 05:27:29

我正在重构一些继承的代码,但被设计决策所困扰,无法找出合适的术语来谷歌这个。我的前任会使用这样的块:

public class ChildClass extends ParentClass {
    {
        inheritedVar = "someVal";
    }

    public ChildClass(){ /* constructor exists */ }
    // rest of code
}

声明没有关键字的代码块有什么意义?它的行为不像一个静态块,我不相信。它是构造函数中设置的替代方法吗?如果正在使用工厂(在这种情况下不是),这会产生一些影响吗?我在这里发现了一个关于C中发生这种情况的相关线程,但推理(范围和变量声明)似乎与Java无关。

任何关于“为什么”的想法或想法将不胜感激。重构这一点很容易,我只是在这一点上感到好奇。


答案 1

它是一个初始值设定项块。(与静态初始值设定项块相关)请参阅此页面上的初始化实例成员:

http://download.oracle.com/javase/tutorial/java/javaOO/initial.html

它是构造函数的替代方法。在提供多个重载构造函数作为共享代码的一种方式时,可以使用它。

但是,就个人而言,我发现让构造函数调用命名初始值设定项方法比依赖匿名代码块要清晰得多。虽然,编译器确实将初始值设定项块复制到幕后的所有构造函数,并且您可能会争辩说,性能提高类似于内联方法声明。


答案 2

它称为初始值设定项块

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

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

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


推荐