Java直接修改类,null引用?

The*_*ain 4 java null class dynamic

我是使用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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这个程序的输出将是:

abc

abc

abc
Run Code Online (Sandbox Code Playgroud)

相反,它是:

abc

null

abc
Run Code Online (Sandbox Code Playgroud)

我真的很困惑为什么会这样.我自学了这个功能,所以我真的不太了解它.任何帮助表示赞赏.谢谢!

Sot*_*lis 7

这些被称为匿名类.

多态性不适用于字段.当你这样做

System.out.println( e.a );
Run Code Online (Sandbox Code Playgroud)

现场a正在对申报/静态类型的解决eTest.由于您尚未明确初始化它,因此默认为null.

您的声明是a在匿名类中调用的字段

Test e = new Test() {
     public String a = s;
};
Run Code Online (Sandbox Code Playgroud)

hiding其父类中的同名字段.

您可以改为使用初始化块

Test e = new Test() {
    {
        a = s;
    }
};
Run Code Online (Sandbox Code Playgroud)

因为子类可以访问该字段.