我是使用Java的新CLASS_NAME(){STUFF}功能的新手,但我遇到的内容似乎很奇怪。 请考虑以下代码:
class Test
{
public String a;
public static void main( String[] args ) throws java.lang.Exception
{
String j = "abc";
//Emulating passing an argument as I did in my code.//
final String s = j;
Test v = new Test();
v.a = s;
Test e = new Test() {
public String a = s;
};
Test g = new Test();
g.a = s;
System.out.println( v.a );
System.out.println( e.a );
System.out.println( g.a );
}
}
我认为这个程序的输出是:
abc
abc
abc
取而代之的是:
abc
null
abc
我真的很困惑为什么会这样。 我自学了这个功能,所以我真的不太了解它。 任何帮助表示赞赏。 谢谢!
答案 0 :(得分:7)
These are called anonymous classes.
多态性不适用于字段。当你这样做
System.out.println( e.a );
正在a
的{{1}}的声明/静态类型上解析字段e
。由于您尚未明确初始化它,因此默认为Test
。
您的声明在匿名类
中有一个名为null
的字段
a
是Test e = new Test() {
public String a = s;
};
其父类中相同名称的字段。
您可以使用初始化块
hiding
因为子类可以访问该字段。