Java 将创建一个基类';方法调用将定向到派生类';重写的方法?
给定一个类Java 将创建一个基类';方法调用将定向到派生类';重写的方法?,java,Java,给定一个类a,它有两个实例方法x()和y(),其中x()调用y(),以及一个扩展a并重写其y()方法的类B 对类型为B的实例调用x()的行为是什么 它是调用A中定义的y(),还是调用B中被覆盖的y()?如果对发生的情况有疑问,则很容易测试: static class A { public void x() { System.out.println("A.x"); y(); } public void y() { System
a
,它有两个实例方法x()
和y()
,其中x()
调用y()
,以及一个扩展a
并重写其y()
方法的类B
对类型为B
的实例调用x()
的行为是什么
它是调用
A
中定义的y()
,还是调用B
中被覆盖的y()
?如果对发生的情况有疑问,则很容易测试:
static class A {
public void x() {
System.out.println("A.x");
y();
}
public void y() {
System.out.println("A.y");
}
}
static class B extends A{
public void y() {
System.out.println("B.y");
}
}
public static void main(String[] args) {
A b = new B();
b.x();
}
输出是
A.x
B.y
因此,您可以看到is确实调用了重写的方法。将调用子类方法。这意味着将调用B中的y()方法 原因是你这么做了
A a = new B();
a.x();
因此,它在运行时指向B的对象
如果你这样做
B b = new B();
b.x();
这将是编译错误,因为b不包含x方法,所以编译器无法解决它。您尝试过这个吗?您观察到了什么?它将使用实例B调用重写的
y()
方法