【问题标题】:When overriding method X, will a call to X from an inherited method use the overriding or the overridden implementation of X?重写方法 X 时,从继承方法对 X 的调用将使用 X 的重写实现还是重写实现?
【发布时间】:2014-11-20 11:34:44
【问题描述】:

我有这两个带有这种方法的 java 类:

class A {
    void m1 () {
        ...
    }

    void m2 () {
        ...
        m1();
        ...
    }
}

class B extends A {
    @Ovveride
    void m1() {
        ...
    }

    void m3() {
        m2();
    }
}

我不确定在m2() 内部调用的m1()m3() 内部调用是B 中定义的新实现还是A 中定义的新实现。

我希望使用 B 中定义的 m1() 实现来调用 A 中定义的 m2() 方法。我的代码是否正确?

【问题讨论】:

  • 你的代码能正确编译和运行吗?
  • 为什么不自己测试一下呢?调试它或添加一些打印语句。
  • @AndréStannek 你说得对,我通常会这样做,但问题是我写的(显然)是伪代码,而更改真正的代码会产生很多工作这样做,并且(更重要的是)错误使用此特定代码所产生的错误可能真的很难检测和调试。但是,我创建了一个新项目,以更简单的方式制作了这个示例并检查了它是否有效:D

标签: java inheritance methods


【解决方案1】:

这正是将要发生的事情。 B 类覆盖方法 m1 并继承 m2。在 m2 中,在当前对象上调用了 m1。 (记住:"m1();" 是 "this.m1();" 的缩写。)由于 m1 在 B 的实例上被覆盖,因此将调用被覆盖的方法。

但不要相信我的话,你自己试试吧!输入一两个简单的System.out.printlns 即可证明。

【讨论】:

  • 非常感谢!我自己尝试了一些玩具项目并检查它是否正常工作;)
  • @LovaJ。很高兴我能帮上忙!
【解决方案2】:

A类:

public class A {
public void m1(){
    System.out.println("Method1 from class A");
}
public void m2(){
    System.out.println("Method2 from class A");
    m1();
}

}

B类:

public class B extends A{
@Override
public void m1(){
    System.out.println("Method1 from class B");
}
public void m3(){
    m2();
}

}

主要:

public class TestAB {
public static void main(String[] args) {
    A a=new A();
    B b=new B();
    a.m1();a.m2();
    System.out.println();
    b.m1();
    b.m3();
}

}

结果:

A 类的方法 1 来自 A 类的方法 2 来自 A 类的 Method1

B 类的方法 1 来自 A 类的方法 2 B类的方法1

【讨论】:

    【解决方案3】:

    您的代码是正确的,但请注意以下几点:

    1. 首先,您没有指定暴露级别(私有、受保护等),在这种情况下,您的方法默认暴露级别是“包保护”。
    2. 您需要实例化 B 才能使用它的覆盖方法:

      A obj = 新 B();
      obj.m3();

    现在你的 obj 的 m1 方法实际上将链接到 B.m1()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多