Java 在子类中使用super关键字访问超类私有字段

Java 在子类中使用super关键字访问超类私有字段,java,class,inheritance,Java,Class,Inheritance,对于编码项目,我有一个包含嵌套类的类。嵌套类是在同一外部类中的子类。目的是让外部类包含嵌套类的一些实例,它可以将这些实例交给外部类的其他实例 嵌套子类允许外部类修改内容,而其超类允许读取内容和调用某些方法。因此,超类对象被传递给其他对象,以链接链中的外部类对象 我的问题涉及访问修饰符。下面是一个极简主义代码示例: abstract class OuterClass { protected class NestedSuperClass<T> { privat

对于编码项目,我有一个包含嵌套类的类。嵌套类是在同一外部类中的子类。目的是让外部类包含嵌套类的一些实例,它可以将这些实例交给外部类的其他实例

嵌套子类允许外部类修改内容,而其超类允许读取内容和调用某些方法。因此,超类对象被传递给其他对象,以链接链中的外部类对象

我的问题涉及访问修饰符。下面是一个极简主义代码示例:

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;
        }
    }
}
抽象类外部类{
受保护类嵌套超类{
私有T数据;
公共嵌套超类(T){
这个数据=t;
}
公共T getOutput(){
返回数据;
}
}
受保护类NestedSubClass扩展NestedSuperClass{
公共嵌套子类(T){
超级(t);
}
受保护的无效设置输出(T){
super.data=t;
}
}
}
在查找一些文档时,我被访问超类的私有字段的能力弄糊涂了,因为在任何地方都没有提到。有没有资源可以解释为什么子类可以这样修改超类的私有字段


我对这项工作完全满意。我还注意到,它似乎适用于标记为受保护而不是私有的数据,并且不使用super关键字。我最感兴趣的是任何提到超级关键字这一功能的文档。提前感谢。

在子类中可以做什么

子类继承其父类的所有公共和受保护成员,而不管该子类在哪个包中。如果子类与其父类位于同一个包中,则它还继承父类的包私有成员。您可以按原样使用继承的成员、替换它们、隐藏它们或用新成员补充它们:

继承的字段可以像其他字段一样直接使用。 您可以在子类中声明一个与超类中的字段同名的字段,从而将其隐藏(不推荐)。 可以在子类中声明不在超类中的新字段。 继承的方法可以直接使用。 您可以在子类中编写一个新的实例方法,该子类具有与超类中相同的签名,从而覆盖它。 您可以在子类中编写一个新的静态方法,该方法与超类中的方法具有相同的签名,从而隐藏它。 可以在子类中声明不在超类中的新方法。 您可以编写一个子类构造函数来调用超类的构造函数,可以隐式调用,也可以使用关键字super。 本课程中的以下部分将对这些主题进行扩展

超类中的私有成员

子类不继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法

嵌套类可以访问其封闭类的所有私有成员,包括字段和方法。因此,子类继承的公共或受保护的嵌套类可以间接访问超类的所有私有成员。

参考: (我的重点):

引用类型的成员(类、接口、字段或方法)或类类型的构造函数只有在类型可访问且声明该成员或构造函数允许访问时才可访问:

[……]

否则,该成员或构造函数被声明为私有,并且仅当它发生在包含该成员或构造函数声明的顶级类的主体内时才允许访问

这仅仅意味着您可以访问所有私有成员,只要您从顶级类型中访问它们

确定可访问性不需要
super
关键字。它也可以不使用。

根据

例6.6-5。对私有字段、方法和构造函数的访问

私有类成员或构造函数只能在包含成员或构造函数声明的顶级类(§7.6)的主体内访问。它不是由子类继承的

因此,内部类可以直接看到非私有字段,因为它继承了它


但是,对于私有字段,内部类必须使用
super.field
来访问它,因为它不是继承的(否则会出现编译器错误“
field
不可见”)。即使它不是继承的,它仍然是可访问的,因为内部类在外部类中,并且顶级类主体中的任何内容都可以访问私有字段。

我投票重新打开这个问题,因为它特别涉及到使用
super
和私有字段访问,而不是一般的内部类我也投票重新讨论这个问题。这似乎与重复的问题无关。提示:编译器生成的合成访问器方法