0

在下面的代码中,我对以下行有一些疑问:

btn.addActionListener(this);
th= new Thread(this);

代码 :

public class Foo  extends Applet implements  Runnable,ActionListener
{
    Button btn;
    Thread th;
    public void init()
    {
        btn=new Button("Click on me");
        add(btn);
        btn.addActionListener(this);  // pass reference as this
        th=null;
    }
    public void run()
    {
        int i=0;
        while(i++<10)
        {
            try{
                th.sleep(500);
                showStatus(new Integer(i).toString());
            }
            catch(Exception e){}
        }
    }
    public void actionPerformed(ActionEvent e)
    {
        if(th==null)
        {
            th= new Thread(this);  // pass reference as this
            th.start();
        }       
    }
}

在 Thread 类构造函数中Thread(Runnable target)分配一个新的 Thread 对象。
我们可以传递 Runnable Target,但我已将作为参数传递。我已经实现了 Runnable 接口,虽然它是可能的
但是我再次将它作为参数传递这种情况下,我们可以传递ActionListener目标。
如果我们在这两种情况下都将它作为参数传递如何得到解决。
我认为 这个参考是针对
1. Foo
2. Runnable
3. ActionListener的参考,
那么如何为方法或构造函数选择合适的参考?

4

2 回答 2

2

您正在调用的方法的方法签名决定了“'this' 的目标”,无论它应该是什么意思。addActionListener() 接受一个 ActionListener 参数;new Thread() 采用 Runnable;等等

于 2012-11-17T06:45:11.210 回答
2

你有一个 IS-A 关系:

  • FooIS-AApplet
  • FooIS-ARunnable
  • FooIS-AActionListener

Foo当创建类型的新对象时,Foo将是“选定的引用”类型。如果您想拥有不同的类型(从所选列表中),您必须向其他人投射。

只要FooIS-A和Applet,方法的合同是完整的:接受which IS-A ,接受which IS-A 。RunnableActionListenerbtn.addActionListener(this);FooActionListenerth= new Thread(this);FooRunnable

于 2012-11-17T07:35:15.803 回答