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

lfa*_*one 25 java oop polymorphism inheritance class

假设我们有一个foo具有私有实例变量的类bar.

现在让我们有另一个班级baz,哪个extends foo.如果没有定义baz访问器方法,访问foo变量中的非静态方法可以吗?barfoo

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

Wim*_*nen 29

不,不是根据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);
Run Code Online (Sandbox Code Playgroud)


Ric*_*dle 21

不,你应该使用 protected.

  • 实际上,如果从类的未来版本中删除了私有变量,则应使用受保护的setter. (3认同)

San*_*dro 6

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

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