看一下下面会打印出什么东西
public class Method {
public static void main(String[] args) {
A a = new B();
a.show();
B b = new C();
b.show();
}
}
class A{
public void show(){
show2();
}
public void show2(){
System.out.println("这里是A");
}
}
class B extends A{
public void show2(){
System.out.println("这里是B");
}
}
class C extends B{
public void show(){
super.show();
}
public void show2(){
System.out.println("这里是C");
}
}
答案是:
这里是B
这里是C
解释:
当调用A a = new B();的时候会先编译。这时候是看左边的类中是否是完整的,然后运行,运行是看右边的,调用重写后的show2方法这时输出的就是”这里是B“
如果这个不能理解的话,就去看下多态的父类变量引用子类对象规则
而下面的 B b = new C();让人不明白的可能就是,super调用父类方法的时候
这里我就简单的说一下:
如果父类变量引用子类对象,子类对象重写了父类的方法用super调用父类中被重写过的
方法, 他的效果就是调用父类的方法。
但是如果不是用super直接调用的。那么就算是被重写的方法在父类的无参构造方法里调用,也是会执行被重写后的结果。