JAVA的转型与动态绑定
2021-04-20
上转型与下转型
想要理解java中的转型只需要记住一句话:
<font color = "red" size="5">
父类引用指向子类对象</font>
这句话是什么意思呢?
Father f1 = new Son(); // 这就叫 upcasting (向上转型)
// 现在 f1 引用指向一个Son对象
Son s1 = (Son)f1; // 这就叫 downcasting (向下转型)
// 现在f1 还是指向 Son对象
但是以下代码就会出错:
Father f1 = new Father();
Son s1 = (Son)f1;//ERROR!!
因为f1是父类的引用,指向了父类对象,父类对象不能够指向子类引用。
上转型的特点
- 上转型对象不能操作子类新增加的成员变量,不能使用子类新增的方法。即为较子类B失去一些属性和功能,这些属性和功能是新增的。
- 上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法。即为上转型对象可以操纵父类原有的属性和功能,无论这些方法是否被重写。
- 上转型对象调用方法时,就是调用子类继承和重写过的方法。而不会是新增的方法,也不是父类原有的方法。
- 可以将对象的上转型对象再强制转换到一个子类对象**(下转型)**,强制转换过的对象具有子类所有属性和功能。
上转型的优点
public static void dosleep(Human h) {
//这里的Human h是传入父类,如果传入子类可以将其上转型为父类
h.sleep();
}
这里以父类为参数,调用有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,如果 dosleep 以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了 JAVA 的抽象编程思想。
动态绑定
概念 方法可以在沿着继承链的多个类中实现,子类可以重写父类的方法。JVM决定运行时调用哪个方法。这就是动态绑定。 原理 假设,对象o是类C1的实例,其中C1是C2的子类,C2是C3的子类,那么o也是C2,C3的实例。如果对象o调用一个方法p,JVM会依次在类C1,C2,C3中查找方法p的实现**(首先看参数类型,找到最合适的参数类型。再在参数类型符合的类方法中按照C1,C2,C3的顺序来查找p)**,直到找到为止。
这也是java中多态的一种体现形式
class 人{
吃饭();
}
class 程序员 extends 人{
吃饭();
编码();
}
另外有个函数:
void doSomething(人){
一个人.编码();//这里就会编译出错,因为编译器只知道参数类型是人,而人的通用行为里只有吃饭,没有编码
一个人.吃饭();//这里没有编译错,因为编译器知道人有吃饭的行为。具体的行为是程序员吃饭还是工人吃饭,就看传的是什么人了,靠运行时函数的晚绑定实现。
}