对象引用实际上就是一个指针,父类的引用可以指向一个子类实例的。但是这个引用是不能调用子类扩展的方法的。
比如:
Class A{
void f(){
}
}
Class B extends A{
void f1(){
}
}
A a = new (B);
a.f1(); //编译不通过,因为对象A是没有f1()方法的。
(B)a.f1(); //编译时可以通过的,因为通过强制转换已经把a转换成B对象的引用
if(a instanceof B) //可以提前判断
(B)a.f1();
A a1 = new A();
(B)a1.f1(); //编译可以通过,但是运行会出错。因为a1就只是一个指向父类A的引用,是不能转换为B的
子类的引用是不能指向父类实例的。因为父类实例是不能提供子类扩展的方法的。
B b1= new A(); //这是编译不过的