私有字段是否由子类inheritance?

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

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()); } } 

当我运行main我得到n=3的输出。 这似乎是SubClassSuperClassinheritance私有属性n

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

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

在关于inheritance的Java文档中 ,它说

子类不inheritance其父类的私有成员。

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

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

但这归结为语义学。

你inheritance并使用getn()方法,它是包私有的,并且可以从子类中获得(因为在这种情况下它们本身就在同一个包中。)你不能直接访问n ,因为它是私有的。 这是getn()方法可以访问n因为它与n在同一个类中,并且您可以访问getn()方法,因为它不是私有的。

如果你这样做:

 System.out.println("n= "+e.n+""); 

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

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

这是一个值得讨论的话题。 产生混淆是因为从技术上讲,子类inheritance了私有字段,因为私有字段存在于子类中,因此当您调用getN()时,它返回n的值。 因此字段n存在于子类中。 如果它不存在,那么当你调用getN()时,它会发出错误,因为字段n不存在。 问题是,它确实存在,并且因为它是在超类中声明的,所以它在技术上是由子类inheritance的。

但是,我们(Java程序员和关于inheritance的java官方文档)不考虑这种inheritance。 根据我们的约定,这不被视为inheritance,因为您无法直接访问这些字段的值。 它几乎就像它们不是你的一样,因为访问它们的唯一方法是使用其他所有人(不是那个超类的子类的类)使用(getters / setter)。

因此,从概念上讲,私有字段不是inheritance的(尽管它们存在于子类中)。

我认为老师应该比他们更清楚地说明这一点。 在深入研究之后,它确实令人困惑。

子类只能通过publicprotected访问方法(getter,setter)访问超类的私有字段。

尝试直接访问私有变量,看看它不起作用:例如

 // won't work System.out.println("n= "+e.n+""); 

这将无法编译:

 class NewExample extends Example { public static void main (String[] args) { NewExample e = new NewExample(); System.out.println("n=" + en); } } 

由于变量被声明为private ,因此子类无法直接访问它。 与方法相同。 如果您将getn()声明为private ,那么您也无法访问它。 如果希望子类可以直接访问n ,则可以将其声明为protected int n ,并允许子类直接修改它。 在许多情况下这可能是也可能不是所希望的。

因为子类的对象正在父类中访问非私有的方法。 并且该方法getN()返回父类的私有属性。 这就是为什么要inheritance父类的私有属性的值。 我希望这有帮助!

这是一个很棒的话题,它让我和我的教授陷入了争吵之中。 但他耐心地解释了我,certificate了自己的勇气。

可访问性与inheritance无关。 无论访问修饰符如何,所有属性和方法都由子类inheritance。

虽然子类无法访问属性或方法,但它仍然inheritance它们!

每种编程语言都有自己对上述inheritance和可访问性概念的解释。