我刚开始使用 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
我真的很困惑为什么会这样。 我自学了这个功能,所以我真的不太了解它。 任何帮助表示赞赏。 谢谢!
最佳答案
These are called anonymous classes.
多态性不适用于字段。当你这样做的时候
System.out.println( e.a );
字段 a
正在根据 e
的声明/静态类型解析,即 Test
。由于您没有显式初始化它,它默认为 null
。
你在匿名类中声明了一个名为a
的字段
Test e = new Test() {
public String a = s;
};
正在隐藏
其父类中的同名字段。
您可以改用初始化 block
Test e = new Test() {
{
a = s;
}
};
因为子类可以访问该字段。
关于Java直接修改一个类,空引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19259432/