匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。9 n* q# J: m4 \5 Y8 n5 q
7 b6 E7 n5 I$ k' [* e- } 这就要采用另一种形式的new语句,如下所示:
6 e Z6 P' C# X + M: C; O" D" S2 {& f* I( m9 e
new ! n/ |$ C$ X9 X( S: d! U! r
+ q! D) H* _) @2 k
这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。1 b! v' a9 b) V) x! { r
- S( ~6 x. y# O6 K0 N) ~. n/ v4 [
如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。如果匿名类实现了一个接口,它的主体必须实现接口的方法。+ e+ D v3 r- c' a7 U1 b
/ ?5 b v5 T1 w2 g0 K9 w 注意匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
( R$ s4 z7 Q) f; h& Q 6 h1 j3 J! r, Y+ u
从技术上说,匿名类可被视为非静态的内部类,所以它们具有和方法内部声明的非静态内部类一样的权限和限制。/ h, @: I. a6 {6 V, J: b0 S
7 ` G. [) u+ ?; z( w' t 如果要执行的任务需要一个对象,但却不值得创建全新的对象(原因可能是所需的类过于简单,或者是由于它只在一个方法内部使用),匿名类就显得非常有用。匿名类尤其适合在Swing应用程序中快速创建事件处理程序。& `, F) ]1 F" q
/ j3 `7 {: _; X- Q4 h9 N, o; p 清单D就是一个非常简单的Swing应用程序,它展示了与匿名类有关的几个概念。这个例子创建了两个匿名类。第一个对java.awt.event.WindowAdapter进行扩展,并在应用程序窗口关闭时调用应用程序的onClose方法。
/ Z$ F6 l- o. H: y. L
7 @2 e2 t4 J+ _* I0 m 即使onClose声明为private,匿名类也能调用它,因为匿名类本质上是应用程序类的一个内部类。第二个匿名类实现了java.awt.ActionListener接口,它在一个按钮被按下后关闭应用程序窗口。注意匿名类可以访问本地变量frame.这是由于匿名类在与frame相同的方法内部声明。然而,frame要被声明为final,否则会生成编译错误。 |