Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匿名类Java中的匿名代码块_Java_Anonymous Class - Fatal编程技术网

匿名类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确实是更常见的习惯用法。

这可能会有所帮助,在我发现“匿名块”实际上被称为“实例初始值设定项”后,我发现了该链接。这正是我想要的肯定!泰