向现有类添加新方法

时间:2017-10-24 09:57:37

标签: java anonymous-function

我知道匿名类。我们可以用它来覆盖类方法。这是一个例子:

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告诉我它并不存在。这个结构的目的是什么?

1 个答案:

答案 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,但我不确定您为什么要这样做。