import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;import javax.swing.JOptionPane;
import javax.swing.Timer;
public class InnerClassTest
{
public static void main(String[] args)
{
TalkingClock clock = new TalkingClock(1000, true);
clock.start();
JOptionPane.showMessageDialog(null, "Quit program?");
System.exit(0);
}
}class TalkingClock
{
public TalkingClock(int interval, boolean beep)
{
this.interval = interval;
this.beep = beep;
}

public void start()
{
ActionListener listener = new TimePrinter(); //***********请看这******************/
Timer t = new Timer(interval, listener);
t.start();
}

private int interval;
private boolean beep;

/*
 * 内部类
 */
public class TimePrinter implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
Date now = new Date();
System.out.println("At the tone, the time is " + now);
if (beep)
{
Toolkit.getDefaultToolkit().beep();
}
}
}
}请看代码中的************************位置处:我的问题是:为什么listener要声明为ActionListener类型的呢?可不可以这样:TimePrinter listener = new TimePrinter();按照代码中那样子写:ActionListener listener = new TimePrinter();这是不是运用了多态???

解决方案 »

  1.   

    TimePrinter 继承了ActionListener,所以TimePrinter就是ActionListener类型的
    所以可以通过ActionListener变量来引用TimePrinter实例对象,
    这个不能叫做多态,多态是一种运行时方法绑定机制,比如父类和子类都实现了方法f,
    Parent p=new Son();通过父类引用指向子类对象,然后调用p.f()则实际上执行的子类的方法体。这个机制,在Thinking in Java中叫向上转型可以直接TimePrinter listener = new TimePrinter();然后传入linstener,因为TimePrinter也是ActionListener类型,而Timer需要ActionListener类的参数