2011-09-07 77 views
1

我可以在几个例子在网页上看到一个新的语法对我来说,这里是一个例子:理解语法

Accumulator<Integer> sum = new Accumulator<Integer>(){ 
    public Integer accumulate(Integer t1, Integer t2) { 
    return t1+t2; 
    } 
    }; 

在一般情况下,这是什么意思,当一个制作的实例后写道{ a method }一类?这是某种古老的语法吗?

谢谢

+2

这是一个*匿名的内部类*。看到[这个答案](http://stackoverflow.com/questions/355167/how-are-anonymous-inner-classes-used-in-java)的更多细节。 –

回答

5

您正在创建一个匿名内部类。

new Accumulator<Integer>() { 
    @Override 
    public Integer accumulate(Integer t1, Integer t2) { 
     return t1 + t2; 
    } 
}; 

定义了Accumulator的匿名实现。然后,您继续将此匿名类的参考分配到sum

认为它是同时定义和分配实现的便捷方式。这是一个syntactic sugar

+0

它是否从我们刚才实例化的类扩展而来? – Numerator

+0

2-Accumulator是一个接口,所以它就像我们实例化一个接口,但并不是真的 - 因为我们定义了一个Anonymous类,我们没有命名,因为它是Anonymous,并且这个新实例将只具有我拥有的能力只是在这个类中定义?谢谢! – Numerator

+2

@Sahil:扩展具体类型的匿名类是完全合法的,并且经常在Swing程序中使用,例如(匿名MouseAdapter,KeyAdapters等) –

2

不,这是一个匿名的内部类。它具有它的类型的接口或类的签名,但可以覆盖公共方法。

1

这是一个常用的匿名内部类。

报价“匿名类本质上是一个没有名字的本地类”。

1

它要么使用重载方法创建匿名子类,要么使用匿名接口实现(取决于Accululator是类还是接口)。

2

这被称为匿名内部类,即没有名称的类,因此可以与其唯一的一个实例一起创建。当需要实现某个接口并且只需要这种实现的一个实例时,这是减少项目中可见类的数量的方法。

但不要滥用此功能。只有在实现很简单时才使用它(1-2行)。