假设我们有一个类foo
,它有一个私有实例变量bar
。
现在让我们开设另一个班级baz
,extends foo
。如果baz
中没有定义访问者方法,foo
中的非静态方法是否可以访问bar
的变量foo
?
顺便说一下,我在Java工作。
答案 0 :(得分:25)
不,不是根据java language specification, 3rd edition:
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);
答案 1 :(得分:21)
不,你应该使用protected.
答案 2 :(得分:6)
对于这样的问题,网站上的表格在哪里:http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
基本上你希望在foo中声明public或protected变量,因为这些变量是子类从它们的父类继承的,因此在baz中可以看到。
答案 3 :(得分:1)
子类无法访问私有成员(这是私有访问控制的全部要点)。
答案 4 :(得分:1)
...如果foo中没有定义访问者方法?
您需要访问者。此外,照顾继承,那个var真的应该在父母身上吗?记住IS-A检查..
答案 5 :(得分:1)
您无法访问后代类中的私有变量。通常,您需要为此使用“protected”或“package”(默认)级别访问权限。但是,如果你想变得非常棘手,你可以使用反射和AccessibleObject来实现它。 我不建议为生产代码执行此操作,除非您真的处于绑定状态;对于测试等,没关系。
答案 6 :(得分:1)
要在子类中使用超类的私有变量,需要一个访问器方法。 否则使用protected修饰符而不是private。
答案 7 :(得分:0)
类的私有变量总是在该类中具有范围。如果必须在子类之间共享,则应声明" protected"
答案 8 :(得分:0)
在子类的实例中存在(继承)私有成员。因为,Sub类的对象也是Super类的对象,但是对于子类而言是不可见的
可以通过Super类的非私有方法间接访问它们。这些方法可以访问和操纵私有成员
答案 9 :(得分:0)
不,baz 将无法访问 bar 变量。 bar 变量应该是 protected 或 public 。