在Java中,为什么代码块没有关键字,只有花括号

在Java中,为什么代码块没有关键字,只有花括号,java,design-patterns,Java,Design Patterns,我正在重新分解一些继承的代码,但是被设计决策难住了,无法找到合适的术语来搜索这个。我的前任将使用如下块: public class ChildClass extends ParentClass { { inheritedVar = "someVal"; } public ChildClass(){ /* constructor exists */ } // rest of code } 声明没有关键字的代码块有什么意义?我不相信,它的行为不像一

我正在重新分解一些继承的代码,但是被设计决策难住了,无法找到合适的术语来搜索这个。我的前任将使用如下块:

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

    public ChildClass(){ /* constructor exists */ }
    // rest of code
}
声明没有关键字的代码块有什么意义?我不相信,它的行为不像一个静态块。它是构造函数中设置的替代方案吗?如果使用工厂,这会有一些影响吗(在本例中不是)?我在这里找到了一个相关的线程,但推理(范围和变量声明)似乎与Java无关


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

范围。块中声明的任何变量在块之后都超出范围。将变量的作用域保持在最小是很有用的


另外,如果您定义了一个匿名内部类,那么您可以将此语法用于构造函数。

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

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

然而,就我个人而言,我发现让构造函数调用命名初始值设定项方法比依赖匿名代码块更为清晰。尽管如此,编译器还是会将初始值设定项块复制到幕后的所有构造函数中,您可能会认为这会提高性能,类似于内联方法声明。

它被称为

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

    {
        // whatever code is needed for initialization goes here
    }
Java编译器将初始值设定项块复制到每个构造函数中。因此,这种方法可以用于在多个构造函数之间共享一块代码


你的前任还在学习。

这是你可能得到的最好的解释。也许在某个时间点上,需要像这样拆分代码。很难说。代码当然应该这样编写:

public class ChildClass extends ParentClass { public ChildClass() { inheritedVar = "someVal"; } // rest of code } 公共类ChildClass扩展了ParentClass{ 公共儿童班(){ inheritedVar=“someVal”; } //代码的其余部分 }
至于初始值设定项块,这里的其他答案已经给出了它的用途。我给出了我的答案,试图回答你要求的“为什么”。不幸的是,要得到真正的答案,你必须问你的前任。

你和迈克都留下了非常好的答案,谢谢你们的链接。我没有考虑过多个重载构造函数,因为我发现的各种类每一个都只有一个构造函数。一个小小的吹毛求疵——编译器没有复制初始值设定项块,它只是添加了一个从构造函数到特殊方法的调用,这就是{}在.class文件中变成的。[静态初始值设定项块成为方法]+1:我同意命名初始值设定项方法。然而,考虑到只有一个构造函数,我的代码库中这一块的全部内容似乎毫无意义。@Riggy,它肯定是多余的。我只发布了少量代码来表达我的观点,而不会给SO读者带来垃圾代码的负担。我包含构造函数只是为了让代码中明显存在构造函数,并且无名块没有替换构造函数。谢谢没问题。我删除了我的答案中询问它的部分。你是对的,它不是最好的代码。我认为前任是在学习。有这么多的开发人员称其他开发人员为白痴,它所做的只是让人们隐藏他们的错误,这样他们就不会感到尴尬或更糟,被解雇。我更愿意看到“您的前任仍在学习如何编写好代码”。我的使命是为开发人员创造安全的环境,让他们学会正确的做事方式,并强烈认为StackOverflow应该是其中之一——您愿意提供帮助并改变您使用的语言吗?是的,我愿意在这里这样做。我不应该假设代码是由应该知道他们在做什么的人编写的。人们受雇于学习,因为他们去所有的时间。当然,如果我每次写一些愚蠢的代码都能得到一角钱的话……对于我们中的任何人来说,有些事情我们都不知道。我不想说这会不会让我们都变成白痴,但如果是这样,我肯定不会把它放在广告牌上。不完全是。如果是在方法体中,那么它应该是范围。这是在类主体中,在方法之外。阅读其他答案。-1这是一个错误的答案。在给定的情况下,它是一个初始化程序块。