java - 本例中多态性背后的逻辑 :

标签 java oop polymorphism

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

最初,当我看到这个例子时,我确信结果会是:

"In Base.staticMethod()"
"In Base.instanceMethod()".

第一个Derived对象初始化后,很明显,由于upcast,它会被解释为Base对象,并且会调用base的静态方法它执行的类,但稍后当它调用其他方法(实例方法)时,它会进入派生函数而不是基类。

为什么,考虑到最初它被认为是Base

最佳答案

静态方法没有方法重写。因此,bObj.staticMethod()(相当于Base.staticMethod)调用基类的静态方法。

在静态方法内,您正在调用bObj.instanceMethod()。对于实例方法,存在方法重写,bObj 的运行时类型决定执行哪个方法 - 在您的情况下是 Derived 的实例方法。

关于java - 本例中多态性背后的逻辑 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48369569/

相关文章:

java - 原型(prototype)设计模式和简单的 Java 克隆之间的区别

oop - 抽象类与 Lambda 参数

java - 使用不同的类型实现相同的行为

java - 在 JBoss-AS 7 上部署 geoserver.war

java - Spring batch + hibernate 在选择期间写入

c# - 使用 Windows.Storage 命名空间时出错

c++ - 子类对象作为虚函数的参数

C - 多态 (void *) 数组

java - 在 TestNG 中多次使用一个类

java - 如何从组键获取组在可扩展 ListView 中的位置?