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方法。