多态是面向对象的三大特征,今天只是所写的内容只是一个开头,对多态的理解以及多态所带来的形式。
如果说继承是为了解决代码重用的问题,那么多态就是为了解决参数的统一问题;而且多态一定要结合继承关系后才可使用。
一、理解多态
实例1:
此时student子类覆写了person父类的print方法,同时实例化的student类对象,所以一定调用被覆写过的方法。
所谓的多态性指的是父子对象之间的转换操作,那么多态性一共有两种转换形式:
1)向上转型:父类 父类对象 = 子类实例,自动完成转换
2)向下转型:子类 子类对象 = (子类) 父类实例,强制转换
二、向上/向下转型
实例2:
关键看:1.方法有没有被覆写;2.new的是那个子类;
1. 现在student类覆写了print()方法,同时new的是student子类,那么一定要找到被覆 写过的方法,要注意:如果此时子类扩充有新的操作方法,那么向上转型之后的对象是无法调用的;
实例3:
因为Person类可以找到的方法只有一个print(),没有fun_stu(),若想实现此功能必须执行向下转型,将父类对象变为子类实例;
实例4:
阶段性总结:
1. 向上转型主要特征,子类为父类对象实例化,父类接受子类对象功能,调用的方法一定是子类所覆写过的方法;(向上转型找共性)
2. 向下转型主要特征,子类扩充了某些功能,这些功能父类没有定义,则需要执行向下转 型,以调用子类特有的功能;(向下转型找特性)
实例5:
此时程序出现“ClassCaseExeption”异常,表示的是类转换异常。指的是两个没有关系的类对象发生转换时所产生的问题。在程序中实例化的是一个person类对象,但是此时没有任何子类产生关系;在类的定义上一个类并不能知道有哪些子类,但子类却可知道他的父类,结论:想发生向下转型之前,必须首先建立好父子之间的关系,这个关系是靠向上转型建立的,而后才可发生向下转型;(向下转型前提:先发生向上转型)
三、instanceof关键字
通过上面的分析发现,向下转型实际上比向上转型危险,因为有可能会造成错误,所以在Java中专门提供了一个instanceof的关键字,利用次关键字就可以判断出某一个对象是否是某一个类的实例
语法:
对象 instanceof 类 ——>返回boolean型数据
范例6:观察instanceof的使用
最规范的写法:
四、相互转型的意义
解释此类问题,假设Person类下有学生、工人、教师三个子类;人一定说话,那么每个身份的人说的话一定不同。要求定义一个方法,此方法可以接受Person类对象的所有引用(实现接受person类的所有子类对象);
实现方式一:利用方法的重载完成
实例7:
上面的参数各写各的,没有统一
如果person类产生了100个子类,而且还有可能随时增加更多子类,最终要的是参数没有得到有效的统一,优化如下:
实现方式二:利用对象的向上转型操作完成
明确:对象在进行向上转型时可以自动完成父类接收子类对象的功能,同时转型之后所调用的的方法一定随实例化子类的不同,同一个方法一定执行不同的功能;
现在结果和之前完全一样,如果随意扩充子类的话,fun()方法不需要做任何修改可以满足所有功能;
六、总结
(一、)关于继承性和多态性总结
1. 这两个特性一定是相辅相成,缺一不可的
2. 继承性解决的是一个类功能扩充的问题,而多态性解决的是参数统一的问题,有了多态性之后才应该发觉,父类的设计是相当重要的,而且子类不要轻易的扩充父类里没有的方法,要按照父类已有的方法规格覆写方法;
(二、)关于对象转型问题
1. 向上转型(90%),自动完成,子类对象自动的转换为父类对象,而后调用的是子类所覆写过的方法;利用对象的向上转型可以解决参数参数统一问题;
2. 向下转型(1%),强制完成,不建议出现,当需要调用子类自己扩充的方法时使用
3. 不转型(9%),很多时候一些类是不进行转型操作的,例如String;
六、多态性主要特征分为两类
1. 方法的多态性
1)重载:同一个方法名称,根据参数的类型或个数不同可执行不同的方法体;
2)覆写:同一个方法根据子类的不同,可以达到不同的功能
2 对象的多态性
1)向上转型:达到参数统一;
2)向下转型:调用子类的特殊功能
3. 利用instanceof关键字可以判断某一个对象是否是某一个类的实例