匿名类Java中的匿名代码块
可能重复:匿名类Java中的匿名代码块,java,anonymous-class,Java,Anonymous Class,可能重复: 在查看一些遗留代码时,我遇到了一些非常令人困惑的问题: public class A{ public A(){ //constructor } public void foo(){ //implementation ommitted } } public class B{ public void bar(){ A a = new A(){
在查看一些遗留代码时,我遇到了一些非常令人困惑的问题:
public class A{
public A(){
//constructor
}
public void foo(){
//implementation ommitted
}
}
public class B{
public void bar(){
A a = new A(){
{ foo(); }
}
}
}
在调试模式下运行代码后,我发现匿名块{foo()}
是在调用构造函数A()
之后调用的。上述功能与执行以下操作有何不同:
public void bar(){
A a = new A();
a.foo();
}
??我认为它们在功能上是等价的,并且认为后一种方法是编写代码的更好/更干净的方法
{ foo(); }
被称为
为什么?
依照
Java编译器将初始值设定项块复制到每个构造函数中。因此,这种方法可以用于在多个构造函数之间共享一块代码
实例初始值设定项是实例变量初始值设定项的有用替代项,只要:(1)初始值设定项代码必须捕获异常,或(2)执行无法用实例变量初始值设定项表示的奇特计算。当然,您可以始终在构造函数中编写此类代码。但是在具有多个构造函数的类中,您必须在每个构造函数中重复代码。使用实例初始值设定项,您只需编写一次代码,即可执行d无论使用什么构造函数创建对象。实例初始值设定项在匿名内部类中也很有用,因为匿名内部类根本不能声明任何构造函数。”
这一点在中也被引用,除非对象的运行时类被访问(通过调用
getClass()
),并且由于某种原因(例如,因为它用作超类型令牌),否则实际上没有区别,只需调用foo()
after construction确实是更常见的习惯用法。这可能会有所帮助,在我发现“匿名块”实际上被称为“实例初始值设定项”后,我发现了该链接。这正是我想要的肯定!泰