多态性不适合继承链中的实例变量
在初学Java程序设计的时候,教材上有这样一个程序是讲“多态性不适合继承链中的实例变量”的。
class Base{
int x=1;
void print(){
System.out.println("当前类为:"+this.getClass().getName());
System.out.println("对象的 x="+this.x);
}
}
class Derived extends Base{
int x=2;
void print(){
System.out.println("当前类为:"+this.getClass().getName());
System.out.println("对象的 x="+this.x);
}
void out(){
System.out.println("OK!");
}
}
public class Confusions{
public static void main(String[] args){
Base obj=new Derived();
obj.print();
System.out.println("对象的 x="+obj.x);
}
}
运行结果如下:
分析一下程序,其实主要涉及到Java的继承与覆盖(域的隐藏),以及对象的类型转换(向上类型转换)的相关知识点。
1、域的隐藏:
2、向上类型转换:从子类移到父类,这是安全的(从一个特殊类型转换到一个通用类型)。唯一的问题就是可能丢失在子类中定义的方法和变量。(eg. 在上面的程序中如果通过obj调用out()方法,将产生编译错误)。