Inner 类
在第7章,我们解释了内部类的基础概念。在这里,你将看到它们为何很重要。我们知
道一个内部类(inner class)是一个定义在其他类或者甚至是表达式中的类。在这一章我们
将说明在使用事件适配器类时,如何通过使用内部类来简化代码。
为了理解使用内部类的好处,让我们看看如下所示列出的这个小应用程序。它没有使
用一个内部类。它主要是在鼠标被按下时,在小应用程序查看器或浏览器的状态栏上显示
“Mouse Pressed”这个字符串。在这个程序中有两个并列的类。MousePressedDemo类扩展
468 第 2 部分 Java 库
了Applet类,而MyMouseAdapter类扩展了MouseAdapter类。MousePressedDemo类的init( )
方法产生了一个MyMouseAdapter类的实例,并且将这个对象作为参数提供给
addMouseListener( )方法。
请注意,一个小应用程序的引用被作为参数提供给了MyMouseAdapter类的构造函数。
这个引用被存储在这个实例的成员变量中,以便以后在mousePressed( )方法中使用。当鼠标
被按下时,在mousePressed( )方法中通过被存储的小应用程序的引用,调用了小应用程序的
showStatus( )方法。换句话说,showStatus( )方法被存储在MyMouseAdapter类中的小应用程
序的引用调用了。
// This applet does NOT use an inner class.
import java.applet.*;
import java.awt.event.*;
/*
*/
public class MousePressedDemo extends Applet {
public void init() {
addMouseListener(new MyMouseAdapter(this));
}
}
class MyMouseAdapter extends MouseAdapter {
MousePressedDemo mousePressedDemo;
public MyMouseAdapter(MousePressedDemo mousePressedDemo) {
this.mousePressedDemo = mousePressedDemo;
}
public void mousePressed(MouseEvent me) {
mousePressedDemo.showStatus("Mouse Pressed.");
}
}
接下来,让我们看看如何通过使用内部类来改进前面的这个程序。在这个程序里,
InnerClassDemo类是一个扩展了Applet类的最高类。MyMouseAdapter类是一个扩展了
MouseAdapter类的内部类。由于MyMouseAdapter类被定义在InnerClassDemo类的范围之内,
所以它可以访问这个类中的所有成员变量和方法。因此,mousePressed( )方法可以直接调用
showStatus( )方法。这就不再需要通过存储一个小应用程序的引用来完成这些工作了。因此,
也就不再需要为了调用这个对象,而给MyMouseAdapter( )方法传递一个小应用程序的引
用。
// Inner class demo.
import java.applet.*;
import java.awt.event.*;
/*
*/
public class InnerClassDemo extends Applet {
第 20 章 事 件 处 理
public void init() {
addMouseListener(new MyMouseAdapter());
}
class MyMouseAdapter extends MouseAdapter {
public void mousePressed(MouseEvent me) {
showStatus("Mouse Pressed");
}
}
}
20.8.1 匿名内部类
一个匿名内部类(Anonymous inner class)是一个没有指定名称的类。在这一节中,我
们将说明一个匿名内部类如何有利于处理事件程序的编写。让我们看一下下面的这个小应
用程序。像以前一样,它还是在鼠标被按下时,在小应用程序查看器或浏览器的状态栏上
显示“Mouse Pressed”这个字符串。
// Anonymous inner class demo.
import java.applet.*;
import java.awt.event.*;
/*
*/
public class AnonymousInnerClassDemo extends Applet {
public void init() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
showStatus("Mouse Pressed");
}
});
}
}
在这个程序中只有一个最高类:AnonymousInnerClassDemo类。在init( )方法中调用了
方法addMouseListener( ),它的参数是一个定义并产生一个匿名内部类的表达式。让我们来
仔细分析一下这个表达式。
new MouseAdapter( ) { ... }的语法意义是告诉编译器在括号中的代码定义了一个匿名
内部类。此外,这个类扩展了MouseAdapter类。这个新类没有名称,但是在这个表达式被
执行时,自动实例化。
由于这个匿名内部类被定义在AnonymousInnerClassDemo类的范围之内,它可以访问这
个类中的所有成员变量和方法。因此,也就可以直接的调用showStatus( )方法了。
像刚才所说明的那样,不论是有名称的内部类还是匿名内部类,都以一种简单而有效
的方式解决了一个让人讨厌的问题。它们也让你的代码更加有效。