如何使用外部匿名类中定义的方法呢​​?

时间:2018-08-03 13:37:16

标签: java object anonymous-class

我可以知道如何使用/调用年龄方法吗?这是学生班。

class Student {
    public static void address(){
        System.out.println("streetB");
    }
}
public class School {
    public static void main(String[] args) {
        Student gg = new Student() {
            public void age() {
                System.out.println("9");

            }
        };
        //how to call age() method here?
    }
}

2 个答案:

答案 0 :(得分:2)

您可能正在寻找不同的东西,因为您刚刚在此处创建了扩展Student类的新类,但是它是匿名的,因此您可以访问该新方法,因为它不属于Student课。

如果您使用的是Java 10,则可以使用var

class Student {
    public static void address(){
        System.out.println("streetB");
    }
}
public class School {
    public static void main(String[] args) {
        var gg = new Student() {
            public void age() {
                System.out.println("9");

            }
        };
        gg.age();
    }
}

但这可能是一个很糟糕的主意,因为没有理由做这种奇怪的事情。

({var在这里起作用,因为它可以在编译时表示该匿名类)

您可能应该将年龄字段和方法添加到Student类中

答案 1 :(得分:0)

由于gg被声明为Student,并且该类中没有age()方法,因此编译器将不允许您调用gg.age(),因为不能保证每个学生实例将能够支持它。

java 10之前的解决方案(如果您使用的是Java 10或更高版本,请阅读this answer

您可以尝试的是反射机制,通过该机制

  • gg.getClass()获取表示由gg变量保存的对象的实际类型的类文字
  • 然后getDeclaredMethod("age")以获取在该类中声明的age方法,
  • 然后invoke(gg)gg持有的对象调用该方法。

简而言之

gg.getClass().getDeclaredMethod("age").invoke(gg);

其他方法是不将匿名类的创建实例分配给任何引用,这将限制其可能性,并直接在创建的对象(如

)上调用方法
new Student() {
    public void age() {
        System.out.println("9");
    }
}.age();

但是通过这种方式,我们以后无法在任何地方重用该对象(因为我们没有对其进行引用)。