Java 声明匿名内部类
另一种方式Java 声明匿名内部类,java,Java,另一种方式 rb.addActionListener(new ActionEvent(ae) { public void actionPerformed(ActionEvent ae) { nowCall(ae); } }); 看到这两个我真的很困惑。似乎没有确切的模式来声明匿名内部类 请解释匿名内部类的语法。区别在于,在第一种情况下,将其作为参数传递给方法,在第二种情况下,将其存储在局部变量中 所以你不能把这两个例子互相比较 实例化新的匿名类并将对象传递给addAct
rb.addActionListener(new ActionEvent(ae) {
public void actionPerformed(ActionEvent ae) {
nowCall(ae);
}
});
看到这两个我真的很困惑。似乎没有确切的模式来声明匿名内部类
请解释匿名内部类的语法。区别在于,在第一种情况下,将其作为参数传递给方法,在第二种情况下,将其存储在局部变量中 所以你不能把这两个例子互相比较
addActionListener
方法th
它们都是一样的。您将匿名类放在声明后面的分号之前:
新动作事件(ae)
{class details,methods etc}
代码>
及
线程(Runnable r)
{public void run(){//do something}}
代码>
在这两种情况下,您都会创建一个类的新实例,在第一个示例中,您将其用作方法的参数,在第二个示例中,您将其分配给一个变量。不同之处在于,您可以将接口实现为匿名内部类,也可以扩展类。在您的示例中,两个都在扩展一个类,就我所见和测试而言,第二个类无效
更常见的是创建新的可运行实现:
Thread th=new Thread(Runnable r) {
public void run() {
// do something
}
};
// notice the ending of above 2 snippets
现在,您可以覆盖普通线程的run
方法:
Thread th=new Thread(new Runnable() {
@Override
public void run() {
// This implements Runnable.run
}
});
。。。但就个人而言,我更喜欢在创建线程时单独指定Runnable
现在,您在结尾处注意到的区别只是表达式是否用作参数(例如,addActionListener
方法或Thread(Runnable)
构造函数,或者它是否直接分配给变量
作为一个单独的表达式,它只是以下两者之间的区别:
Thread th=new Thread() {
@Override
public void run() {
// This overrides Thread.run
}
};
及
[…]注意上面两个片段的结尾
在第一个示例中,尾随的)
只是
Thread th = new Runnable(expression);
(例如,你的两个例子有不同的结尾,因为其中一个是作业的右侧。)
线程th=…
;
另一个是方法调用的参数
…addActionListener(…
);
创建匿名类的语法很简单:
rb.addActionListener(
正如您所看到的,这是两个示例的模式
发件人:
3.12.3.匿名类的新语法
我们已经看到了定义和实例化匿名类的语法示例。我们可以将该语法更正式地表示为:
new SomeClassOrInterface() {
// implementation goes here
}
或:
new class-name ( [ argument-list ] ) { class-body }
另外,第二个示例中有一个输入错误。它可能应该是new-Thread(){…
或new-Thread(r){…
(尽管在后一种情况下不会调用重写的方法)。您不能只是“直接重写”一个方法。两个都是匿名内部类,事实上它们的声明没有任何区别。都是anon。没有区别。当然这是一个匿名类。你能告诉线程的这个特定子类的名称吗?好的,我知道了。我更改了答案。类是匿名的或内部的。你有匿名类的例子。一个内部类ss是一个有名称的非静态嵌套类。@Peter Oracle不同意您的观点。请参阅第一个代码段中的@Jon Skeet runnable接口是在runnable中实现的?@Meprogrammer:是的,这是runnable中唯一的方法。@Jon Skeet是所有构造函数中的一个,在您的第一个示例中使用的线程构造函数。@Meprogrammer:第二个,w它只有一个类型为Runnable
@jonskeet的参数,我不明白“怎么做”。你能解释一下吗
new class-name ( [ argument-list ] ) { class-body }
new interface-name () { class-body }