从子类访问父类的私有实例变量?
-
03-07-2019 - |
题
假设我们有一个类 foo
,它有一个私有实例变量 bar
。
现在让我们有另一个类 baz
, extends foo
。如果 foo
中没有定义访问器方法, baz
中的非静态方法可以访问 foo
的变量 bar
?
顺便说一下,我在Java工作。
解决方案
不,不是根据 java语言规范,第3版:
6.6.8示例:私有字段,方法和构造函数
私人 类成员或构造函数是 只能在体内进入 包含的顶级类(§ 7.6) 会员的声明或 构造函数。它不是由遗传继承的 子类。
但不管这种语言限制,你可以 通过反思访问私有字段:
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中声明public或protected变量,因为这些变量是子类从它们的父类继承的,因此在baz中可以看到。
子类无法访问私有成员(这是私有访问控制的全部要点)。
...如果foo中没有定义访问者方法?
您需要访问者。此外,照顾继承,那个var真的应该在父母身上吗?记住IS-A检查..
您无法访问后代类中的私有变量。通常你会想要使用“受保护的”或“包裹” (默认)级别访问权限。但是,如果你想变得非常棘手,你可以使用反射和 AccessibleObject 。 我不建议为生产代码执行此操作,除非您真的处于绑定状态;对于测试等,没关系。
要在子类中使用超类的私有变量,需要一个访问器方法。 否则使用protected修饰符而不是private。
类的私有变量总是在该类中具有范围。如果必须在子类之间共享,则应将其声明为“protected”