2011-11-23 69 views
2

我知道在初始化一个类变量时,Java会让你用变量的类型做欺骗。沿着线:这个语法叫什么? `new Type(){...}`

SomeType foo = new SomeType() { 
    { 
     this.fooField = 12345; 
    } 
    @Override public void someMethod() { 
     throw new ReallyWeirdException(); 
    } 
}; 

这将创造可变foo一个实例,其中someMethod()具有不同的语义比通常SomeType,并且其中fooField初始化为比其正常的默认以外的值。

但是什么是new Type() { ... }语法调用?

回答

3

匿名内部类。

您在代码(内部)中定义了一个没有名称(匿名)但继承自SomeType的类(class),然后重写它的一些方法和属性。

+0

啊,对了,谢谢!当你知道你在找什么时,更容易阅读它。 :-) –

0

我会称这是一个匿名(子)类。

注意,你在这里做两件事情 - 压倒一切的someMethod在您的匿名子类,并且还增加了一个实例初始化(这是设置fooField到一个新的值)

+0

是的,我知道它正在做两件事。初始化块有时很有用。 (虽然我现在意识到,为了这个例子的目的,我可能应该省略其中的一个。) –

2

你有

  1. 匿名类()和
  2. 初始化块(用于fooField)。
2

匿名内部类。

new SuperType(construction parameters) { 
    inner class methods and data 
} 

这里,SuperType可以是一个接口,如ActionListener;然后,内部类实现该接口。或者SuperType可以是一个类;那么,内部类就扩展了这个类。

匿名内部类不能有构造函数,因为构造函数的名称必须与类的名称相同,并且该类没有名称。相反,构造参数被赋予超类的构造函数。特别是,每当内部类实现一个接口时,它就不能有任何构造参数。不过,你必须提供一组圆括号,如

new InterfaceType() { methods and data }