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

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

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

顺便说一下,我在Java工作。

不,不是根据java语言规范,第3版 :

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

私有类成员或构造函数只能在顶级类(第7.6节)的主体内访问,该类包含成员或构造函数的声明。 它不是由子类inheritance的。

但无论这种语言限制如何,您都可以 通过reflection访问私有字段 :

 Field privateStringField = MyClass.class.getDeclaredField("privateString"); privateStringField.setAccessible(true); String fieldValue = (String) privateStringField.get(privateObject); System.out.println("fieldValue = " + fieldValue); 

不,为此您应该使用protected.

对于这样的问题,网站上的表格位于何处: http : //java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

基本上,您希望在foo中声明公共变量或受保护变量,因为这些变量是子类从其父级inheritance并因此在baz中看到的变量。

子类无法访问私有成员(这是私有访问控制的全部要点)。

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

你需要访问者。 除此之外,请注意inheritance,那个var真的应该在父母身上吗? 记得IS-A检查..

您无法访问后代类中的私有变量。 通常,您希望为此使用“protected”或“package”(默认)级别访问权限。 但是,如果你想变得非常棘手,你可以使用reflection和AccessibleObject来实现它。 我不建议为生产代码执行此操作,除非您真的处于绑定状态; 对于测试等,没关系。

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

类的私有变量总是在该类中具有范围。 如果必须在子类之间共享,则应将其声明为“protected”