我知道匿名类。我们可以用它来覆盖类方法。这是一个例子:
public class User {
private final String name;
public User(final String name){
this.name=name;
}
public void sayHello(){
System.out.println("Hello : "+name);
}
public static void main(String[] args) {
User s = new User("CHORT"){
@Override
public void sayHello(){
System.out.println("HELLO FROM ANONYMOUS CLASS");
}
};
}
}
但是我注意到以下结构也是正确的(我的IDEA没有突出显示)
public class User {
private final String name;
public User(final String name){
this.name=name;
}
public void sayHello(){
System.out.println("Hello : "+name);
}
public static void main(String[] args) {
User s = new User("CHORT"){
public void sayHello2(){
System.out.println("HELLO FROM ANONYMOUS CLASS");
}
};
}
}
但是当我想调用方法sayHello2时,IDEA告诉我它并不存在。这个结构的目的是什么?
答案 0 :(得分:4)
首先,问题的标题是错误的。您没有“向现有类添加新方法”。您向扩展现有类的匿名类添加了一个方法。
匿名类可以包含常规类所执行的任何方法。它们不必仅包含它们扩展的类的方法或它们实现的接口。
因此,在匿名类中定义sayHello2
是完全有效的,但是没用,因为你无法从匿名类体外部调用该方法。
另一方面,如果你从匿名类体内调用它(并且你可以使它private
,因为无论如何都无法从外部调用)它会很有用:
User s = new User("CHORT") {
@Override
public void sayHello() {
sayHello2();
}
private void sayHello2() {
System.out.println("HELLO FROM ANONYMOUS CLASS");
}
};
编辑:我想到的另一件事 - 您可以使用反射从外部调用sayHello2
,但我不确定您为什么要这样做。