(Java)如何从超类中调用重写的"继承"方法?

R. *_*mes 2 java methods overriding class inherited

我们直接进入代码:

Father.java:

public class Father {

    public void DoSmth(Father object) {
        // Do something else and print
        Print(object);
    }

    public void Print(Father object) {
        System.out.println("Father");
    }

}
Run Code Online (Sandbox Code Playgroud)

Son.java:

public class Son extends Father {

    public void Print(Son object) {
        System.out.println("Son");
    }

}
Run Code Online (Sandbox Code Playgroud)

Main.java:

public class Main {

    public static void main(String[] args) {

        Father o1 = new Father();
        Son o2 = new Son();

        o1.DoSmth(o1);
        o1.DoSmth(o2);

    }

}
Run Code Online (Sandbox Code Playgroud)

所以,我想得到:

Father
Son
Run Code Online (Sandbox Code Playgroud)

然后,我得到:

Father
Father
Run Code Online (Sandbox Code Playgroud)

我真的不太明白为什么(对于o1.DoSmth(o2))它从父类调用方法,因为o2是Son类型.无论如何我能得到想要的答案吗?

提前致谢

PS:实际上,我想从Father类中调用Print(Son类)方法.可能吗?

Era*_*ran 5

public void Print(Son object)不会覆盖public void Print(Father object).它超载了它.

这就是说,DoSmth(Father object)在对两案执行Father情况,所以它会叫public void Print(Father object)Father,即使类Son类没有覆盖它.

如果将Son类方法更改为:

@Override
public void Print(Father object) {
    System.out.println("Son");
}
Run Code Online (Sandbox Code Playgroud)

并将你main改为:

public static void main(String[] args) {
    Father o1 = new Father();
    Son o2 = new Son();

    o1.DoSmth(o1);
    o2.DoSmth(o2);
}
Run Code Online (Sandbox Code Playgroud)

你会得到输出

Father
Son
Run Code Online (Sandbox Code Playgroud)