对于编码项目,我有一个包含嵌套类的类.嵌套类在同一个外部类中进行子类化.其目的是让外部类包含嵌套类的一些实例,它可以传递给外部类的其他实例.
嵌套子类允许外部类修改内容,而超类允许读取内容并调用某些方法.因此,超类对象被交给其他对象以链接链中的外部类对象.
我关心访问修饰符的问题.这是一个简约的代码示例:
abstract class OuterClass { protected class NestedSuperClass<T> { private T data; public NestedSuperClass (T t) { this.data = t; } public T getOutput() { return data; } } protected class NestedSubClass<T> extends NestedSuperClass<T> { public NestedSubClass (T t) { super(t); } protected void setOutput(T t) { super.data = t; } } }
当查找一些文档时,我被访问超级类的私有字段的能力感到困惑,没有在任何地方被提及.有没有资源解释为什么子类被允许以这种方式修改超类的私有字段?
我完全可以这样工作.我也注意到,似乎可以使用标记为受保护而不是私有的数据,而不使用超级关键字.我最感兴趣的是提供超级关键字的这种能力的任何文档.提前致谢.
解决方法
根据
Java Language Specification
Example 6.6-5. Access to private Fields,Methods,and Constructors
A private class member or constructor is accessible only within the body of the top level class (§7.6) that encloses the declaration of the member or constructor. It is not inherited by subclasses.
那么发生的是内部类可以直接看到非私有字段,因为它继承它.
然而,对于私有字段,内部类必须使用super.field来访问它,因为它不被继承(否则你得到编译器错误“字段是不可见的”).即使它不被继承,它仍然是可访问的,因为内部类在外部类中,并且私有字段可以由顶级类的正文内的任何内容访问.