繁体   English   中英

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

[英]Accessing private instance variables of parent from child class?

假设我们有一个类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 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM