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

我正在重新考虑一些inheritance的代码,但是被设计决定所困扰,并且无法找出适当的条款来谷歌这个。 我的前任会使用像这样的块:

public class ChildClass extends ParentClass { { inheritedVar = "someVal"; } public ChildClass(){ /* constructor exists */ } // rest of code } 

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

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

它是一个初始化块。 (与静态初始化程序块相关)请参见在此页面上初始化实例成员:

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

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

但是,就个人而言,我发现构造函数调用命名的初始化方法而不是依赖匿名代码块会更清楚。 虽然,编译器确实将初始化程序块复制到幕后的所有构造函数,但您可能会认为性能增加类似于内联方法声明。

它被称为初始化块 。

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

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

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

你的前任还在学习。

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

公共类ChildClass扩展ParentClass {
     public ChildClass(){
         inheritedVar =“someVal”;
     }
     //代码的其余部分
 }

至于初始化块,其目的由其他答案给出。 我把答案扔进去,试图回答你要求的“为什么”。 不幸的是,对于真正的答案,你必须问你的前任。

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

此外,如果您定义匿名内部类,则将此语法用于构造函数。