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

Java 从子类访问父类的私有实例变量?,java,oop,class,inheritance,polymorphism,Java,Oop,Class,Inheritance,Polymorphism,假设我们有一个类foo,它有一个私有实例变量bar 现在让我们有另一个类,baz,它扩展了foo。如果在foo中没有定义访问器方法,那么baz中的非静态方法能否访问foo的变量bar 顺便说一下,我在Java工作 否,因此您应该使用受保护的。子类不能访问私有成员(这是私有访问控制的整个点) 对于此类问题,网站上的表格在哪里: 基本上,您希望在foo中声明public或protected变量,因为这些是子类从其父类继承的变量,因此可以在baz中看到。…如果foo中没有定义访问器方法 你需要访问者。

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

现在让我们有另一个类,
baz
,它扩展了foo。如果在
foo
中没有定义访问器方法,那么
baz
中的非静态方法能否访问
foo
的变量
bar


顺便说一下,我在Java工作

否,因此您应该使用受保护的
子类不能访问私有成员(这是私有访问控制的整个点)

对于此类问题,网站上的表格在哪里:

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

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

你需要访问者。此外,注意继承,var真的应该在父级中吗?请记住,这是一项检查。

否,不是根据:

6.6.8示例:私有字段、方法和构造函数

私人 类成员或构造函数是 只能在主体内访问 最高等级(§7.6)包含 成员的声明或 构造器。它不是继承人 子类

但无论这种语言限制如何,您都可以:


不能访问子类中的私有变量。通常,您希望对此使用“受保护”或“包”(默认)级别的访问。然而,如果你想变得非常棘手,你可以求助于使用反射,并着手解决它。
我不建议在生产代码中这样做,除非你真的陷入困境;对于测试等,这很好。

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

类的专用变量始终在该类中具有作用域。如果必须在子类之间共享,则应将其声明为“受保护”

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


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

实际上,如果私有变量从类的未来版本中删除,您应该使用受保护的setter。use can protected on instance variableSPer刚刚使用您的解决方法向库中添加了一个函数。谢谢@Wim。下面是一个基于此的完整类的示例,如果有人只想复制粘贴以进行测试:。警告:如果超类和子类都在同一顶级类的范围内,则可以访问超类的
private
成员。
Field privateStringField = 
   MyClass.class.getDeclaredField("privateString");
privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);