JAVA中父类引用指向子类对象,我们称这个过程为向上转型,向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。
下面是测试代码:
public class Testpolymorp {
public static void main(String[] args){
Animal a = new Animal();
Animal b = new Dog();/*这样的定义方法也行,不会报错,b本质是Animal类型指向了Dog对象,
自动向上转型,new的时候在堆创建了对象,包含了seeDoor的方法,
给Animal对象的时候被屏蔽掉了*/
/*b.seeDoor();报错,这个方法不在Animal类型里面*/
Dog b2 = (Dog)b;//正确做法;堆里的地址赋予了栈中的变量b2
b2.seeDoor();//不会报错,向下转型后被屏蔽掉的部分又恢复了。
animalCry(a);
animalCry(b);
static void animalCry(Animal a){//这是父类方法
a.shout();
}
}
class Animal{
public void shout(){
System.out.println("叫了一声");
}
}
class Dog extends Animal{
public void shout(){
System.out.println("汪汪汪");
}
public void seeDoor(){
System.out.println("正在看门!");
}
}
以上仅仅是我个人观点,不对的地方还请大家指出来
输出结果: