假设我们有一个类 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”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top