例子:
public class Super {
protected int a = 1;
void say(){
System.out.println("superSAy");
}
}
public class Sub extends Super{
public int a = 2;
void say(){
System.out.println("subSAy");
}
public static void main(String[] args) {
Super s = new Sub();
s.say();输出subSAy,运行时调用的是子类的方法,如果父类没有这个方法,编译会报错
说明多态调用会先检查父类中有没有此方法,没有则报错。
System.out.println(s.a);输出 1,父子都有相同属性,运行时调用得是父类的属性,如果父类没有这个属性,编译会报错
}
}
假设子类中有父类没有的方法,那么s是调用不到的,说明了多态调用时这个对象s实际是Super,只是方法被复写了。记住子类可以调用父类方法,这是继承,反过来,父类是不能调用子类的特有方法的。
结论:成员变量、静态方法看左边,非静态方法编译看左边,运行看右边。