此示例无法编译:
public class Test{
private LinkedList<Integer> lst = new LinkedList<>();
public static Test of(int i){
return new Test(){{
this.lst.addFirst(i);
}};
}
}
但这样做:
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;
}
}
为什么呢?在这两种情况下,我们都会从类体中访问私有成员。
答案 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)
。所以你没有得到编译错误。