给定两个类,一个父类和一个子类:
class A {
private void greet() {
System.out.println("Class A");
}
}
class B extends A {
public void greet() {
System.out.println("Class B");
}
}
一个有一个名为greet()
的方法,它是private
,另一个定义了一个同名的方法,只是它是public
.现在,据我所知,子方法的greet()
没有覆盖父方法,因为它‘隐藏’了它?(鉴于私有方法不能被覆盖的事实?)
现在,给定以下类和方法(被认为与A
和B
在同一个包中):
public class Main {
public static void main(String[] args) {
B b = new B();
b.greet();
}
}
这应该会编译.但这一次:
public class Main {
public static void main(String[] args) {
A a = new B();
b.greet();
}
}
这里的这个不能编译,因为它缺少类型转换.
我的问题是:为什么?如果greet()
方法在两个地方都是public
,那么两次都会显示Class B
.对于第二种情况,a
实际上引用了一个类型为B
的对象,并且直接调用了类B
中的方法,我很困惑为什么Java在运行时没有这样做.
我试着在一本准备OCA的书中阅读更多关于多态的内容,但作者似乎对此并不那么具体.