私有字段是否由子类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
的输出。 这似乎是SubClass
从SuperClass
inheritance私有属性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的(尽管它们存在于子类中)。
我认为老师应该比他们更清楚地说明这一点。 在深入研究之后,它确实令人困惑。
子类只能通过public
或protected
访问方法(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和可访问性概念的解释。
- 为什么一个类不能扩展枚举?
- 设计inheritance类
- 使用Java中的几个子类实现父类方法
- 为什么静态方法不涉及多态(后期绑定)我看到错误,静态方法不能被覆盖
- 从抽象类inheritance静态变量
- 所有类如何从Objectinheritance?
- 将generics类@MappedSuperclass应用为targetEntity.Error:模型上的@ManyToOne.Unit.parent引用未知实体:models.GenericHierarchic
- 复合inheritance:如何在子类构造函数中分配一个最终字段,该字段取决于’this’值(向后引用)?
- 使用inheritance的Struts2 Convention插件结果