【问题标题】:Will a base class' method calls be directed to the derived class' overridden methods?基类的方法调用是否会被定向到派生类的重写方法?
【发布时间】:2014-11-19 08:37:52
【问题描述】:

给定一个类A,它有两个实例方法x()y(),其中x() 调用y(),以及一个扩展A 并覆盖它的y() 方法的类B

B 类型的实例上调用x() 的行为是什么?

它是调用A 中定义的y(),还是调用B 中覆盖的y()

【问题讨论】:

  • 你试过了吗?你观察到了什么?
  • 它将调用重写的y() 方法与B实例

标签: java


【解决方案1】:

如果对发生的情况有疑问,测试起来相当容易:

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();
}

输出是

斧头 B.y

所以你可以看到它确实调用了被覆盖的方法。

【讨论】:

    【解决方案2】:

    将调用子类方法。这意味着将调用 B 中的 y() 方法。

    你这样做的原因

      A a = new B();
       a.x();
    

    所以它在运行时指向 B 的对象。

    如果你这样做了

     B b = new B();
     b.x();
    

    b 不包含 x 方法是编译错误,编译器无法解析。

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2018-11-11
      • 2019-01-08
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 2016-01-01
      • 2015-04-08
      相关资源
      最近更新 更多