我读过几篇相互矛盾的在线文章.我认为这将是匿名内部类的一个例子:
button.addActionListener(new ActionListener() {
public void actionPerfored(ActionEvent e) {
// do something.
}
});
Run Code Online (Sandbox Code Playgroud)
但是,我也看到这被描述为一个匿名的内部类:
ActionListener myListener = new ActionListener() {
public void actionPerformed(ActionEvent event) {
// do something.
}
};
button.addActionListener(myListener);
Run Code Online (Sandbox Code Playgroud)
哪个是哪个,为什么?谢谢!
编译器如何知道嵌套类型,如:
.....等等
需要清晰.......
匿名内部类默认是私有的吗?我可以公开吗?
我需要通过反射访问方法.
在另一篇文章中,我被告知在一个使用它的函数之后(下面)定义一个匿名内部类是错误的.但是,类似下面的东西编译并运行正常:
public class CompTest {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<Integer>(intComp);
ts.add(1);
ts.add(2);
ts.add(3);
System.out.println(ts.toString());
}
private static Comparator<Integer> intComp = new Comparator<Integer>() {
@Override
public int compare(Integer i1, Integer i2) {
return i2.compareTo(i1);
}
};
}
Run Code Online (Sandbox Code Playgroud)
官方消息是什么?我的猜测是,既然intComp
是static
,那么当类CompTest
被"加载" 时它被实例化一次(由于只有一个主方法并且没有CompTest
构造任何对象,因此不确定该加载是如何发生的),因此当main()
需要时intComp
,它是可用的无论源文件在何处实际定义.
即使它确实有效(出于上述原因,甚至是不同的原因)......这是不好的做法吗?
例如:
for (int i = 0; i < 10; i++){
SomeClass something = new SomeClass();
something.setOnClickListener(new OnClickListener() {
public void onClick(){
doSomething(i);
}
});
}
Run Code Online (Sandbox Code Playgroud)
我不允许使用变量i
,Eclipse建议我制作i
final
,但我不能这样做,因为我需要它来迭代?
我知道这有效:
class Main{
public static void main(String[]args){
AbstractClass object = new AbstractClass(){ ... };
}
}
Run Code Online (Sandbox Code Playgroud)
它创建了一个隐式扩展AbstractClass
类的对象(很明显abstract
).
但是下面的工作也会这样吗?
class Main{
public static void main(String[]args){
ConcreteClass object = new ConcreteClass (){ ... };
}
}
Run Code Online (Sandbox Code Playgroud)
ConcreteClass是一个不是的类abstract
.