Java中,多态的意为相同的行为,不同的实现。

  其中,多态又分为静态多态和动态多态。两者的区别在于:前者在编译器就可以确定运行期的最终结果,即编译时就可以确定调用哪个方法;而后者在编译期则不能确定运行效果,只有运行后,依据所绑定对象的的不同,才能确定运行效果,即运行中系统才能确定方法所指的对象。静态多态主要体现在方法的重载和单独使用方法重写上,而动态多态体现为动态绑定和方法的重写上。

  引入动态绑定的概念之前,需要先了解转型技术。转型即数据类型的转换,通常发生在赋值符号左右两边数据类型不同的时候。

  对于基本数据类型,当表示数据范围小的数据类型向表示数据范围大的数据类型转换(如int类型转成double类型)时,可以自动完成数据类型的转换。反之,范围大的数据类型向范围小的数据类型转换时,需要我们进行强制转换,即用待转的数据类型用小括号括起来,放在待转的变量前,完成强制的显式转换。但是,不得不指出,强制数据类型转换会造成数据精度的丢失,比如double类型的3.14转换成int类型的3,丢失了小数部分0.14的精度。

  对于引用数据类型转换,有个转换的前提,它不是所有类型的引用数据类型都能转,转换必须要发生在有继承关系的类身上。同基本数据类型相似,这种引用数据类型转换分为向上转型和向下转型。因为引用数据类型是由“引用”指向具体的对象,实际发生类型转换时,也仅仅是“引用”的类型的转换,而实际的对象并不会发生改变。向上转型即为把子类对象赋值给父类的引用,这样转换会自动完成,并且一定成功。向下转型为将父类引用指向的某个子类对象(即向上转型的结果)赋值回子类的引用,此时子类引用和原本的子类对象必须相同(级本类引用指向本类对象),否则运行时会发生类型转换异常。

  有了以上的转型的概念,我们就可以详细解释动态多态:当手上有一个父类引用,调用被子类重写的方法时,只有运行起来以后,根据该引用实际指向那种对象(父类本身还是某个子类),才能确定这个方法运行后的最终结果。

  若使用了动态多态方法绑定了父类引用,那么能从该父类引用中看到的只有对象中来自父类的被访问修饰符允许的属性和行为,那么问题来了,要想要看到子类所特有的属性和行为应该怎么办呢,方法中如何确定父类引用绑定的是那种子类对象呢?

  使用instanceof关键字,可以完美的解决这一个问题。instanceof关键字是一种运算符,用来判断某个引用所指向的对象是不是某个类型的实例,如果是会的返回boolean值true,否则得到false,这样,我们也得到了判断我们绑定的父类引用指向的具体类型的办法,此时我们就可以用向下转型,将绑定的父类引用转换为相应的子类引用,这样,就可以调出改子类特有的子类和行为。

  当两个类要绑定关系的时候,即类中的方法需要与对方类关联起来的时候,绑定对方的父类引用可以获得更好的可拓展性,提高代码的复用性。