【发布时间】:2015-12-14 16:00:29
【问题描述】:
我的一个朋友问我这个问题。为什么下面的代码在调用 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");
}
}
【问题讨论】:
-
这么多重复,这么少时间... 编辑: 呃,好吧,也许不是子类的皱纹。
-
如果您希望它理解,请在此处阅读访问修饰符docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html。 private 访问修饰符用于 Class 并且 main 在此类中,因此调用该方法没有问题
-
这里最好写
A aa = new A()而不是A aa = b。由于A aa = b是合法的并且aa.x()在A#main()中是合法的,所以一切正常。 -
你的理解是正确的。如果它是一个公共方法,它将被 B 类继承,并且在运行时 B 类的方法将被执行。如果方法不是继承的并且只存在于 B 中,那么编译器会抛出错误。
标签: java