创建父类(狗类)
public class Dog {
public void play(){
System.out.println("狗玩耍");
}
static void call(Dog dog){
dog.play();
}
}
创建狗类的子类(大黄狗)
public class DaHuang extends Dog {
public static void main(String[] args) {
DaHuang daHuang = new DaHuang();
Dog.call(daHuang);
}
public void f1(){
}
}
结果:
狗玩耍
现象:
对于父类的call方法,参数是Dog类型的,但是调用的时候输入的值是DaHuang类型的
在java编程中,编译器会对类型进行检查,如果参数类型是int型,那么输入的值肯定不能为String类型,
但是这次实验参数类型是Dog类型,输入的值是DaHuang类型,并且运行成功。
结论:
- 在编译器编译过程中,编译器会识别且认为DaHuang的对象也是一种Dog的对象,而且不会认为call方法是必须由Dog来调用,在call方法中,参数值可以对Dog和Dog的所有子类起作用,这种将DaHuang对象引用转换为Dog对象引用的动作称为“向上转型”
- 在向上转型的过程中,即调用call方法的过程中,DaHuang对象的方法f1会丢失。
- 子类继承父类,继承父类所有方法,并且可以新增自己的方法,当向上转型时,子类除了保留继承父类的方法之外,其它新增的方法就会被编译器清除。