我正在重新考虑一些继承的代码,但是被设计决定所困扰,并且无法找出适当的条款来谷歌这一点。我的前任会使用像这样的块:
public class ChildClass extends ParentClass {
{
inheritedVar = "someVal";
}
public ChildClass(){ /* constructor exists */ }
// rest of code
}
声明没有关键字的代码块有什么意义?它不像静态块,我不相信。它是在构造函数中设置的替代方法吗?如果使用工厂(在这种情况下它不是),这会产生一些影响吗?我在this happening in C找到了一个相关的主题,但推理(范围和变量声明)似乎与Java无关。
任何关于“为什么”的想法或想法都将受到赞赏。很容易重新考虑这一点,我现在只是好奇。
答案 0 :(得分:33)
这是一个初始化程序块。 (与静态初始化程序块相关)请参见在此页面上初始化实例成员:
http://download.oracle.com/javase/tutorial/java/javaOO/initial.html
它是构造函数的替代品。您可以在提供多个重载构造函数时使用它作为共享代码的方法。
然而,就个人而言,我发现构造函数调用命名的初始化方法而不是依赖匿名代码块更清楚。虽然,编译器会将初始化程序块复制到幕后的所有构造函数,但您可能会认为性能提升类似于内联方法声明。
答案 1 :(得分:18)
它被称为initializer block。
实例变量的初始化程序块看起来就像静态初始化程序块,但没有静态关键字:
{ // whatever code is needed for initialization goes here }
Java编译器将初始化程序块复制到每个构造函数中。因此,该方法可用于在多个构造函数之间共享代码块。
答案 2 :(得分:4)
你的前任还在学习。
这是你可能获得的最佳解释。也许在某个时间点,需要将代码拆分为这样。很难说。代码当然应该这样写:
public class ChildClass extends ParentClass { public ChildClass() { inheritedVar = "someVal"; } // rest of code }
至于初始化程序块,其目的由其他答案给出。我把答案扔进去,试图回答你要求的“为什么”。不幸的是,对于真正的答案,你必须问你的前任。
答案 3 :(得分:-3)
范围。块中声明的任何变量都在块之后超出范围。将变量限制在最低限度是有用的。
此外,如果您定义匿名内部类,则将此语法用于构造函数。