java - 代码如何在方法覆盖中流动

标签 java overriding

对于下面的代码,我得到的输出是

In Base.foo()  
In Derived.bar()

代码:

class Base {
    public static void foo(Base bObj) {
        System.out.println("In Base.foo()");
        bObj.bar();
    }  
    public void bar() {
        System.out.println("In Base.bar()");
    }
}
class Derived extends Base {
    public static void foo(Base bObj) {
        System.out.println("In Derived.foo()");
        bObj.bar();
    }
    public void bar() {
        System.out.println("In Derived.bar()");
    }
}
class OverrideTest {
    public static void main(String []args) {
        Base bObj = new Derived();
        bObj.foo(bObj);
    }
}

代码如何流动?我如何获得上述输出。我有点困惑,正在寻找解释。

最佳答案

静态方法不会被覆盖,没有虚拟调用。

在您的Derived 类中,static foo 方法隐藏其父类的static foo 方法。

但是,在您的 main 方法中,您在引用类型 Base 上调用 foo,因此 Base#foo 被调用(所以它打印 "In Base.foo()")。

反过来,静态方法在传递的对象上调用bar,该对象IS-A Base,但恰好是派生

由于 bar 是一个实例方法并且覆盖,因为您的签名匹配,调用解析为实例类型,即Derived,因此打印了 "In Derived.bar()"

注意事项

  • 一个好的做法是在覆盖的方法上使用@Override 注释。 这将无法为您的 foo 方法编译,因为它是静态的,因此清楚地指出那里不可能被覆盖。
  • 另一个好的做法(如 Jon Skeet 所指出的)是避免在实例对象上调用 static 方法(即更喜欢显式的 ClassName.staticMethod 习语),因为这可能会导致调用该方法的范围困惑。

关于java - 代码如何在方法覆盖中流动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35058712/

相关文章:

css - CSS 术语 '.override' 的正确定义是什么?

java - NiFI 自定义处理器 ClassNotFoundException

java - 覆盖默认外观 Java

java - 实现具有相同方法的多个接口(interface)

java - Android - java.lang.RuntimeException :App is crashing as soon as it launches

java - 通过避免在特定场景中重写 java 父类(super class)方法来重新使用父类(super class)方法

java - 处理一组被覆盖的方法取决于它是任意的还是交替的

java - 从java中的字符串中解析出简单的日期

Future 任务完成后 Java 进程没有退出

java - 使用不同的内部方法调用泛化方法