在下面的代码中,我对以下行有一些疑问:
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
如何为方法或构造函数选择合适的引用?。
答案 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 Applet
,Runnable
和ActionListener
,方法的合同就会被完整填充:btn.addActionListener(this);
需要Foo
}哪个IS-A ActionListener
,th= new Thread(this);
需要Foo
哪个是IS-A Runnable
。