一、java覆盖如何执行:编译看左边,运行看右边
在子类方法覆盖父类方法时,在编译期,编译器会检查这个对象的引用类型是否含有此方法。如果没有则编译会出错,有则会通过编译。但在执行期,JVM寻找的不是引用指向的类型,而是堆上的对象。(即编译看左边,运行看右边)。
1.子类方法覆盖了父类方法
//Father类
public class Father {
public void turnOn(){
System.out.println("父类方法turnOn执行");
}
}
//Son类,继承了Father类
public class Son extends Father {
@Override
public void turnOn() {
System.out.println("子类方法turnOn执行");
}
}
public class Demo {
public static void main(String[] args) {
Father f = new Son();
f.turnOn();
}
}
运行Demo类中的main()方法:
在编译期,编译器会检查对象f的引用类型(即Father)是否有turnOn(),由于Father类有这个方法,于是编译器不会报错,程序编译成功。在运行期,究竟运行Father类的两个方法还是Son类