从类中访问私有字段拒绝编译

时间:2016-07-11 11:12:46

标签: java

此示例无法编译:

public class Test{
    private LinkedList<Integer> lst = new LinkedList<>();

    public static Test of(int i){
        return new Test(){{
            this.lst.addFirst(i);
        }};
    }
}

DEMO

但这样做:

public class Test{
    private LinkedList<Integer> lst = new LinkedList<>();

    public static Test of(int i){
        Test t = new Test();
        t.lst.addFirst(i);
        return t;
    }
}

DEMO

为什么呢?在这两种情况下,我们都会从类体中访问私有成员。

2 个答案:

答案 0 :(得分:5)

使用代码

new Test() { ... }

您实际上声明并实例化了Test匿名子类。并且子类根本无法访问其父级的私有成员。

有关详细信息,请参阅JLS §15.9 (Class Instance Creation Expressions)JLS §15.9.5 (Anonymous Class Declarations)

答案 1 :(得分:1)

定义时:

return new Test(){{
      this.lst.addFirst(i);
}};

您创建了Test的匿名子类。 lst的访问说明符为private。因此,您可能无法从private课程访问super班级的sub成员。所以你得到编译错误。

但是当你宣布:

Test t = new Test();
t.lst.addFirst(i);

您正在从私有成员所属的类的lst方法中访问私有成员public static Test of(int i)。所以你没有得到编译错误。