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是父类的引用,指向了父类对象,父类对象不能够指向子类引用。

上转型的特点

  1. 上转型对象不能操作子类新增加的成员变量,不能使用子类新增的方法。即为较子类B失去一些属性和功能,这些属性和功能是新增的。
  2. 上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法。即为上转型对象可以操纵父类原有的属性和功能,无论这些方法是否被重写
  3. 上转型对象调用方法时,就是调用子类继承和重写过的方法。而不会是新增的方法,也不是父类原有的方法。
  4. 可以将对象的上转型对象再强制转换到一个子类对象**(下转型)**,强制转换过的对象具有子类所有属性和功能。

上转型的优点

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(人){
   一个人.编码();//这里就会编译出错,因为编译器只知道参数类型是人,而人的通用行为里只有吃饭,没有编码
   一个人.吃饭();//这里没有编译错,因为编译器知道人有吃饭的行为。具体的行为是程序员吃饭还是工人吃饭,就看传的是什么人了,靠运行时函数的晚绑定实现。
}