rb.addActionListener(new ActionEvent(ae) {
public void actionPerformed(ActionEvent ae) {
nowCall(ae);
}
});
另一种方式
Thread th=new Thread(Runnable r) {
public void run() {
// do something
}
};
// notice the ending of above 2 snippets
我真的很困惑看到这两个。似乎没有确切的模式来声明一个匿名的内部类。
请解释匿名内部类的语法。
答案 0 :(得分:8)
第二个是无效的,据我所知和测试。
更常见的是创建一个新的Runnable实现:
Thread th=new Thread(new Runnable() {
@Override
public void run() {
// This implements Runnable.run
}
});
现在你可以覆盖正常线程的run
方法:
Thread th=new Thread() {
@Override
public void run() {
// This overrides Thread.run
}
};
...但我个人更喜欢在创建主题时单独指定Runnable
。
现在你注意到的差异只是表达式是否用作参数(例如addActionListener
方法或Thread(Runnable)
构造函数,或者它是否只是直接赋值给变量将整个new TypeName() { ... }
想象成一个单独的表达式,它只是:
Thread th = expression;
和
Thread th = new Runnable(expression);
答案 1 :(得分:3)
[...] 注意上述2个片段的结尾
第一个示例中的尾随)
只是
rb.addActionListener(
(即,你的两个例子有不同的结局,因为一个是作业的右侧
Thread th = ...
;
,另一个是方法调用的参数
...addActionListener( ...
);
创建匿名类的语法很简单:
new SomeClassOrInterface() {
// implementation goes here
}
您可以看到两个示例的模式。
来自Anonymous Classes (Java in a Nutshell):
<强> 3.12.3。匿名类的新语法
我们已经看到了定义和实例化匿名类的语法示例。我们可以更正式地表达这种语法:
new class-name ( [ argument-list ] ) { class-body }
或:
new interface-name () { class-body }
另外,你的第二个例子中有一个拼写错误。它可能应该是new Thread() { ...
或new Thread(r) { ...
(虽然在后一种情况下,不会调用被覆盖的方法)。
答案 2 :(得分:2)
不同之处在于,在第一种情况下,您将其作为参数传递给方法,而在第二种情况下,您将其存储在局部变量中。
因此,您无法将两个示例相互比较。
答案 3 :(得分:0)
实例化新的匿名类并将对象传递给addActionListener
方法。
实例化新的匿名类并将对象分配给局部变量th
答案 4 :(得分:0)
他们都是一样的。您在声明之后,在分号之前放置匿名类:
new ActionEvent(ae)
{class details, methods etc}
;
和
Thread(Runnable r)
{ public void run() { // do something }}
;
在这两种情况下,您都会创建一个新的类实例,在第一个示例中,您将其用作方法的参数,在第二个示例中,您将其分配给变量。
答案 5 :(得分:0)
不同之处在于您可以将接口实现为匿名内部类或扩展类。在你的例子中,两者都在扩展一个类