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

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,这是为什么?

当调用一个对象的方法时,会沿着继承链向上查询此方法。你new的对象的所属类是B,所以方法查找路径是B->A,在B中找到了play方法则立即执行。换句话说,B类继承自A类并重载了play方法。