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/