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()
方法