繁体   English   中英

向现有类添加新方法

[英]Add new method to existing class

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

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告诉我它不存在。此构造的目的是什么?

首先,问题的标题是错误的。 您没有“向现有类添加新方法”。 您将方法添加到扩展现有类的匿名类中。

匿名类可以包含常规类所做的任何方法。 它们不必只包含它们扩展的类的方法或它们实现的接口。

因此,在匿名类中定义sayHello2是完全有效的,但是非常无用,因为您不能从匿名类主体外部调用该方法。

另一方面,如果您确实从匿名类主体中调用它(并且可以将其设为private ,因为无论如何都不能从外部调用它),则可能会很有用:

User s = new User("CHORT") {
    @Override
    public void sayHello() {
        sayHello2();
    }
    private void sayHello2() {
        System.out.println("HELLO FROM ANONYMOUS CLASS");
    }
};

编辑:我想过的另一件事-您可能可以使用反射从外部调用您的sayHello2 ,尽管我不确定您为什么要这么做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM