Java中的匿名类

时间:2011-12-08 12:35:03

标签: java class anonymous

是否可以像这样在Java中创建一个匿名类:

public static void main(String[] args) {

    AnonymousClass a = new AnonymousClass() {
        int whatever = 1;
    };

    System.out.println(a.whatever);
}

我认为这会有效,但事实并非如此。我是否误解了匿名类的内容,或者只是语法错误?

5 个答案:

答案 0 :(得分:4)

可以这样做:

public static void main(String[] args) {
    System.out.println(new Object() {
      int whatever = 1;
    }.whatever);
}

也就是说,您只能直接从实例化表达式中取消引用字段和方法。 [编辑:根据评论,您可以在编译器为您推断类型的地方使用它 - 恰好是instantion表达式,或者作为传递给它的泛型方法的返回值。你不能将它存储在一个变量中并使用那里的字段/方法,所以它没有像例如的匿名类那样有用C#。

编辑:如前所述,您可以声明方法本地类:

public static void main(String[] args) {
    class Local {
      int whatever = 1;
    }
    Local local = new Local();
    System.out.println(local);
}
但是,稍微有点罗嗦,就像非静态内部类和常规匿名类一样,它保留了对封闭this的隐式引用(在非静态方法中)。

答案 1 :(得分:2)

为此,AnonymousClass需要是一个接口或类:

private interface AnonymousClass {

}

public static void main(String[] args) {

        AnonymousClass a = new AnonymousClass() {
            int whatever = 1;
        };

    System.out.println(a.whatever); // this won't work
}

编辑

已更正,正如评论中所述,whatever无法访问/出现。

答案 2 :(得分:2)

如果可能的话,我们就不会再将它们称为匿名:您的示例定义了一个名为Anonymous的类。您可以使用如下名称定义内部类:

public static void main(String[] args) {
    class NotAnonymous {
        public int whatever = 1;
    }
    NotAnonymous na = new NotAnonymous();
    System.out.println(na.whatever);
}

答案 3 :(得分:0)

你指的是原始的匿名类实例,它没有字段“what” - 所以你不能这样引用它。

答案 4 :(得分:0)

你可以这样创建你的课程。但是,a.whatever调用将失败,因为对象类型仍为AnonymousClass,并且未将whatever定义为属性。

如果覆盖已在AnonymousClass类或接口中定义的某个方法或属性,该对象将使用匿名类而不是旧类的实现,但如果引入新方法或属性则不会