从子类访问父类的私有实例变量?
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 。
【讨论】:
以上是关于从子类访问父类的私有实例变量?的主要内容,如果未能解决你的问题,请参考以下文章