4

我不熟悉使用 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

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

4

1 回答 1

7

这些被称为匿名类。

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

System.out.println( e.a );

该字段a正在解析为声明/静态类型eTest. 而且由于您没有显式初始化它,它默认为null.

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

Test e = new Test() {
     public String a = s;
};

hiding其父类中的同名字段。

您可以改为使用初始化块

Test e = new Test() {
    {
        a = s;
    }
};

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

于 2013-10-08T22:13:48.793 回答