30

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

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

顺便说一句,我正在使用 Java。

4

10 回答 10

36

不,不是根据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);
于 2009-05-04T23:52:32.780 回答
23

不,你应该使用protected.

于 2009-05-04T23:42:56.390 回答
6

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

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

于 2009-05-04T23:48:36.707 回答
2

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

于 2013-04-28T20:37:16.440 回答
1

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

于 2009-05-04T23:43:05.703 回答
1

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

你需要访问器。此外,请注意继承,该 var 真的应该在父级中吗?记住 IS-A 检查..

于 2009-05-04T23:49:20.260 回答
1

您不能访问后代类中的私有变量。通常,您需要为此使用“受保护”或“包”(默认)级别的访问权限。但是,如果您想变得非常棘手,则可以使用反射和AccessibleObject来解决它。除非您确实处于绑定状态,否则我不建议对生产代码这样做;用于测试等,没关系。

于 2009-05-05T00:05:35.010 回答
0

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

于 2017-04-09T19:22:08.880 回答
0

子类的实例中存在(继承)私有成员。由于子类的对象也是超类的对象,但对子类不可见

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

于 2019-11-06T19:05:33.323 回答
0

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

于 2021-07-15T05:47:18.360 回答