私有字段是否由子类继承?

har*_*ish 9 java inheritance private-members

我已经读过子类不能继承私有字段或方法.但是,在这个例子中

class SuperClass {
    private int n=3;
    int getN() {
        return n;
    }
}

class SubClass extends SuperClass {
    public static void main(String[] args) {
        SubClass e = new SubClass();
        System.out.println("n= " + e.getN());
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行时,main我得到输出为n=3.这似乎SubClass是继承了私有属性nSuperClass.

所以,请解释这里发生了什么.谢谢.

Gar*_*all 20

子类'具有'其超类的字段,但不能直接访问它们.类似地,子类'拥有'私有方法,但您不能直接从子类调用或覆盖它们.

关于继承Java文档中,它说

子类并没有继承父类的私有成员.

但是,我认为将其视为更有用

子类继承其父类的私有成员,但无权访问它们

但这归结为sematics.


Mic*_*rry 6

您正在继承并使用该getn()方法,该方法是包私有的,并且可以从子类获得(因为在这种情况下,两者本身都在同一个包中.)您无法n直接访问,因为它是私有的.这getn()是可以访问的方法,n因为它与同一个类在同一个类中n,并且您可以访问该getn()方法,因为它不是私有的.

如果你这样做:

System.out.println("n= "+e.n+"");
Run Code Online (Sandbox Code Playgroud)

...代替当前行,然后由于上述原因无法编译.

通过setter/getter方法公开私有变量是完全正常的行为,这实际上就是你在这里所做的.不同之处在于,您可以在获取或设置变量时检查/限制/更改/记录/修改变量的值,并且可以在代码编译时进行重大更改.如果你只是公开一个字段并让人们直接访问它,你就不能这样做.