2009-05-04 117 views
18

比方说,我们有一个类foo它有一个私人实例变量bar从子类访问父级的私有实例变量?

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

我在Java中工作,顺便说一句。

回答

22

否,:

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); 
+0

使用可以保护实例变量 – 2018-01-22 20:59:14

19

不,你应该使用protected.

+3

实际上,您应该使用受保护的setter,以防私有变量从未来版本的类中移除。 – jmucchiello 2009-05-05 00:06:46

1

子类不能访问私有成员(这是私人的访问控制整点)。

1

不能在派生类访问私有变量。通常你会想要使用“protected”或“package”(默认)级别访问权限。然而,如果你想变得非常棘手,你可以使用反射和AccessibleObject来实现它。 我不会推荐你为生产代码做这件事,除非你真的在绑定;进行测试等等,这很好。

1

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

0

类的私有变量总是在该类的内部有一个作用域。如果必须在子类之间共享,则应该声明为“受保护的”