我的一个朋友向我提出这个问题。为什么以下代码在调用aa.x()时没有出错?
我理解aa是对B类对象的引用,但是在类A的方法中调用类A的私有方法,它是可见的,因此可以访问。
我的理解是否正确?或者这背后还有其他原因吗?
public class A {
public void xyz() {
System.out.println("A");
}
private void x() {
System.out.println("A:x");
}
public static void main(String[] args) {
B b = new B();
A aa = b;
aa.x();
aa.xyz();
B bb = (B) aa;
bb.xyz();
bb.xyz12();
}
}
class B extends A {
public void xyz() {
System.out.println("B");
}
public void xyz12() {
System.out.println("B-12");
}
}
答案 0 :(得分:3)
我无法立即使用子类找到副本,但从根本上说它与this question的答案相同。
管理x
的访问权限有两件事:
代码是进行访问的地方。由于x
是A
的私有,因此访问它的代码必须是A
中方法的一部分。它不能在子类(B
)或不相关的类中。
您正在使用哪种参考。如果您有A
引用,则可以访问x
。如果您有B
引用,则即使您的代码是A
方法的一部分,也不能 。您可以将其转换为A
,然后访问x
,但您无法直接使用B
类型的引用。
答案 1 :(得分:0)
它只是可见的,因为调用它的main方法包含在A类中。将它移到B类并且它不起作用
答案 2 :(得分:0)
由于私有方法未被继承,超类引用会调用自己的私有方法。
您的main
方法是A
的方法,因此可以调用x()
私有方法。
私人修饰符 - 该字段只能在自己的类中访问。