多态性(重点)

来源:互联网 发布:vb中picturebox画粗线 编辑:程序博客网 时间:2024/06/05 03:15

多态是面向对象的三大特征,今天只是所写的内容只是一个开头,对多态的理解以及多态所带来的形式。

如果说继承是为了解决代码重用的问题,那么多态就是为了解决参数的统一问题;而且多态一定要结合继承关系后才可使用。

一、理解多态

实例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关键字可以判断某一个对象是否是某一个类的实例

 

0 0
原创粉丝点击