假设我们有一个foo
具有私有实例变量的类bar
。
现在让我们有另一个类,baz
,其中extends foo
。如果没有定义访问器方法,baz
可以访问foo
变量中的非静态方法吗?bar
foo
顺便说一句,我正在使用 Java。
假设我们有一个foo
具有私有实例变量的类bar
。
现在让我们有另一个类,baz
,其中extends foo
。如果没有定义访问器方法,baz
可以访问foo
变量中的非静态方法吗?bar
foo
顺便说一句,我正在使用 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来解决它。除非您确实处于绑定状态,否则我不建议对生产代码这样做;用于测试等,没关系。
一个类的私有变量总是在该类内部有一个作用域。如果必须在子类之间共享,则应将其声明为“受保护”
子类的实例中存在(继承)私有成员。由于子类的对象也是超类的对象,但对子类不可见
它们可以通过 Super 类的非私有方法间接访问。这些方法可以访问和操作私有成员
不,baz 将无法访问 bar 变量。bar 变量应该是 protected 或 public 。