【发布时间】:2010-10-23 18:51:53
【问题描述】:
假设我们有一个类foo,它有一个私有实例变量bar。
现在让我们有另一个类,baz,它是extends foo。如果foo中没有定义访问器方法,baz中的非静态方法可以访问foo的变量bar吗?
顺便说一句,我正在使用 Java。
【问题讨论】:
标签: java oop class inheritance polymorphism
假设我们有一个类foo,它有一个私有实例变量bar。
现在让我们有另一个类,baz,它是extends foo。如果foo中没有定义访问器方法,baz中的非静态方法可以访问foo的变量bar吗?
顺便说一句,我正在使用 Java。
【问题讨论】:
标签: java oop class inheritance polymorphism
不,不是根据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);
【讨论】:
private 成员。
不,你应该使用protected.
【讨论】:
对于这样的问题,请在此处的网站上找到表格:http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
基本上,您希望在 foo 中声明 public 或 protected 变量,因为这些是子类从其父类继承的变量,因此可以在 baz 中看到。
【讨论】:
要在子类中使用超类的私有变量,需要一个访问器方法。 否则使用受保护的修饰符而不是私有的。
【讨论】:
子类不能访问私有成员(这是私有访问控制的重点)。
【讨论】:
...如果 foo 中没有定义访问器方法?
您需要访问器。此外,请注意继承,该 var 真的应该在父级中吗?记住 IS-A 检查..
【讨论】:
您不能访问后代类中的私有变量。通常,您需要为此使用“受保护”或“包”(默认)级别的访问权限。但是,如果您想变得非常棘手,则可以使用反射和AccessibleObject 来解决问题。 除非您确实处于绑定状态,否则我不建议对生产代码这样做;用于测试等,没关系。
【讨论】:
一个类的私有变量总是在该类内部有一个作用域。如果必须在子类之间共享,则应声明为“受保护”
【讨论】:
子类的实例中存在(继承)私有成员。由于子类的对象也是超类的对象,但对子类不可见
它们可以通过 Super 类的非私有方法间接访问。这些方法可以访问和操作私有成员
【讨论】:
不,baz 将无法访问 bar 变量。 bar 变量应该是 protected 或 public 。
【讨论】: