是否可以像这样在Java中创建一个匿名类:
public static void main(String[] args) {
AnonymousClass a = new AnonymousClass() {
int whatever = 1;
};
System.out.println(a.whatever);
}
我认为这会有效,但事实并非如此。我是否误解了匿名类的内容,或者只是语法错误?
答案 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
类或接口中定义的某个方法或属性,该对象将使用匿名类而不是旧类的实现,但如果引入新方法或属性则不会