从子类访问父类的私有实例变量?

Posted

技术标签:

【中文标题】从子类访问父类的私有实例变量?【英文标题】:Accessing private instance variables of parent from child class? 【发布时间】:2010-10-23 18:51:53 【问题描述】:

假设我们有一个类foo,它有一个私有实例变量bar

现在让我们有另一个类,baz,它是extends foo。如果foo中没有定义访问器方法,baz中的非静态方法可以访问foo的变量bar吗?

顺便说一句,我正在使用 Java。

【问题讨论】:

【参考方案1】:

不,不是根据java language specification, 3rd edition:

6.6.8 示例:私有字段、方法和构造函数

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

但是不管这种语言限制,你可以 access private fields through reflection:

Field privateStringField = 
   MyClass.class.getDeclaredField("privateString");
privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);

【讨论】:

使用可以保护实例变量 Super 刚刚使用您的解决方法向库中添加了一个函数。 谢谢@Wim。这是一个基于此的完整类示例,如果有人只想复制粘贴进行测试:coding-stream-of-consciousness.com/2019/06/11/…. 警告:如果超类和子类都在同一个***类的范围内,您可以访问超类的private 成员。【参考方案2】:

不,你应该使用protected.

【讨论】:

实际上,您应该使用受保护的设置器,以防私有变量从类的未来版本中删除。【参考方案3】:

对于这样的问题,请在此处的网站上找到表格:http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

基本上,您希望在 foo 中声明 public 或 protected 变量,因为这些是子类从其父类继承的变量,因此可以在 baz 中看到。

【讨论】:

【参考方案4】:

要在子类中使用超类的私有变量,需要一个访问器方法。 否则使用受保护的修饰符而不是私有的。

【讨论】:

【参考方案5】:

子类不能访问私有成员(这是私有访问控制的重点)。

【讨论】:

【参考方案6】:

...如果 foo 中没有定义访问器方法?

您需要访问器。此外,请注意继承,该 var 真的应该在父级中吗?记住 IS-A 检查..

【讨论】:

【参考方案7】:

您不能访问后代类中的私有变量。通常,您需要为此使用“受保护”或“包”(默认)级别的访问权限。但是,如果您想变得非常棘手,则可以使用反射和AccessibleObject 来解决问题。 除非您确实处于绑定状态,否则我不建议对生产代码这样做;用于测试等,没关系。

【讨论】:

【参考方案8】:

一个类的私有变量总是在该类内部有一个作用域。如果必须在子类之间共享,则应声明为“受保护”

【讨论】:

【参考方案9】:

子类的实例中存在(继承)私有成员。由于子类的对象也是超类的对象,但对子类不可见

它们可以通过 Super 类的非私有方法间接访问。这些方法可以访问和操作私有成员

【讨论】:

【参考方案10】:

不,baz 将无法访问 bar 变量。 bar 变量应该是 protected 或 public 。

【讨论】:

以上是关于从子类访问父类的私有实例变量?的主要内容,如果未能解决你的问题,请参考以下文章

子类能继承父类的哪些变量和方法

Java子类访问父类的私有成员变量

第8章 继承(Objective-C程序设计)

子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法

子类从父类继承过来的方法可以操作子类自己定义的成员变量吗

Java继承,子类实例化时,调用父类的无参构造方法