内部类

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( )方法了。
像刚才所说明的那样,不论是有名称的内部类还是匿名内部类,都以一种简单而有效
的方式解决了一个让人讨厌的问题。它们也让你的代码更加有效。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值