【发布时间】:2021-09-09 02:46:51
【问题描述】:
这个想法有些模棱两可,我需要澄清一下。
我的问题是使用此代码时:
public class B {
private void don() {
System.out.println("hoho private");
}
public static void main(String[] args) {
B t = new A();
t.don();
}
}
class A extends B {
public void don() {
System.out.println("hoho public");
}
}
输出为hoho private。
这是因为main函数与方法don在同一个类中,还是因为覆盖?
我在一本书中读过这个想法,当我将main 函数放在另一个类中时,出现编译器错误。
【问题讨论】:
-
你在隐藏而不是覆盖。
-
除了在类型之外不可见(也许与这里的问题更相关),私有方法是不是多态的——只有在类型上定义的方法表达式将永远被调用;不会发生动态调度。在所示示例中,
t表达式的类型为B,因此t.don()将始终调用 B 的don。 运行时类型A是无关紧要的,并且不允许“覆盖”这种私有方法。 -
那么this的工作原理即使子类对象被分配给子类引用它仍然调用父类私有方法
-
@user2864740 的评论不仅解决了真正的模棱两可的行为。
标签: java