Java:如何为方法或构造函数选择引用?

时间:2012-11-17 06:40:42

标签: java

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

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 目标。
如果我们在两种情况下都将 作为参数传递给它。 我认为 引用的目标是参考 Foo
2.可运行的
3. ActionListener
如何为方法或构造函数选择合适的引用?。

2 个答案:

答案 0 :(得分:2)

您正在调用的方法的方法签名决定了“'这个'所针对的”,无论这个意图是什么意思。 addActionListener()接受一个ActionListener参数; new Thread()接受Runnable;等

答案 1 :(得分:2)

你有一个IS-A关系:

  • Foo IS-A Applet
  • Foo IS-A Runnable
  • Foo IS-A ActionListener

创建Foo类型的新对象时,Foo将为“选定参考”类型。如果你想要有不同的类型(来自选定的列表),你必须转发给其他人。

只要Foo IS-A AppletRunnableActionListener,方法的合同就会被完整填充:btn.addActionListener(this);需要Foo }哪个IS-A ActionListenerth= new Thread(this);需要Foo哪个是IS-A Runnable