【问题标题】:How to use methods defined in anonymous class outside of it?如何使用在它之外的匿名类中定义的方法?
【发布时间】:2018-08-03 13:37:16
【问题描述】:

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

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?
    }
}

【问题讨论】:

  • gg.age(),和其他方法一样吗?
  • @cricket_007 不起作用,Student 类没有 age 方法,仅适用于 address 或使用 var 声明 gg

标签: java object anonymous-class


【解决方案1】:

您可能正在寻找不同的东西,因为您刚刚在这里创建了扩展 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

【讨论】:

    【解决方案2】:

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

    Pre 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();
    

    但是这样我们以后不能在任何地方重用该对象(因为我们没有引用它)。

    【讨论】:

    • 您可以在第二个示例中获得该引用,但我什至不想显示如此肮脏的代码:D,因为您可以从构造函数/初始化程序中获得它
    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多