向上转型中调用应该时基类还是子类的问题

package main;


public class main {

    static class A{
        public void play() {
            System.out.println("A");
        }
    }

    static class B extends A{
        public void play() {
            System.out.println("B");
        }

    }

    public static void tune(A i) {
        i.play();
    }

    public static void main(String[] args) {
        B b = new B();
        tune(b);
    }

}

b向上转型之后为基类A,那么应该调用的是A类中的play方法,但是程序输出的确是B,这是为什么?

兄弟,你继承这一章没理解好,B类继承了A,B类重载了A类的play方法,所以B类的实例调用的就必然是B类的play方法啊。

你new的是B对象,用A引用接没问题,但无论你怎么搞,调用的都是B的方法。你可以在tune方法里打个断点,看看参数 i 的类型,必定是B类型的