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

时间:2009-05-04 23:40:59

标签: java oop class inheritance polymorphism

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

现在让我们开设另一个班级bazextends foo。如果baz中没有定义访问者方法,foo中的非静态方法是否可以访问bar的变量foo

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

10 个答案:

答案 0 :(得分:25)

不,不是根据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);

答案 1 :(得分:21)

不,你应该使用protected.

答案 2 :(得分:6)

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

基本上你希望在foo中声明public或protected变量,因为这些变量是子类从它们的父类继承的,因此在baz中可以看到。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

...如果foo中没有定义访问者方法?

您需要访问者。此外,照顾继承,那个var真的应该在父母身上吗?记住IS-A检查..

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

在子类的实例中存在(继承)私有成员。因为,Sub类的对象也是Super类的对象,但是对于子类而言是不可见的

可以通过Super类的非私有方法间接访问它们。这些方法可以访问和操纵私有成员

答案 9 :(得分:0)

不,baz 将无法访问 bar 变量。 bar 变量应该是 protected 或 public 。