一、多态的概念
面向对象时,有三大特征:封装、继承和多态,而多态性就是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果。
(多态现实意义的理解:现实中也会出现事物的多种形态,比如张三既可以是学生,也可以是人,即出现两种形态。)
二、多态存在的前提:1.要有继承关系
2.要有方法覆盖
3.父类引用指向了子类的实例
三、多态的优点
- 1. 消除类型之间的耦合关系
- 2. 可扩充性
- 3. 可替换性
- 4. 简化性
- 5. 灵活性
- 6. 接口性
四、这里主要讲讲多态的转型、重写
转型分为向上转型和向下转型
向上转型:
多态是如何实现向一个方法传入不同的类型得到不同的结果?这里是因为出现了叫上转型,即将子类对象地址赋值给父类引用,void getStudentService(PbStudent student)方法接收了不同的子类对象地址。
例子:
旧:
//创建vip学生类
zsStudentVip zsStudentVip = new zsStudentVip("101", "张三", "zsteach@163.com", LocalDate.now().plusDays(365));
//创建普通学生类
zsStudentGenaral pbStudentGenaral = new zsStudentGenaral("101", "张三", "zsteach@163.com");
新:
//创建Vip学生类
zsStudent studentVip = new zsStudentVip("101", "张三", "zsteach@163.com", LocalDate.now().plusDays(365));
//创建普通学生类
zsStudent studentGenaral = new zsStudentGenaral("101", "张三", "zsteach@163.com");
向下转型:
有向上转型自然有向下转型,如果想调用子类特有的方法必须向下转型,如下:
在PbStudentVip类中isValid()方法是它特有的,如果通过父类调用子类特有的方法是编译不通过的,因为父类没有子类特有的方法。
如果要调用子类的方法必须向下转型,即由父类型转为子类型。
例子:
zsStudent studentVip = new zsStudentVip("101", "张三", "zsteach@163.com", LocalDate.now().plusDays(365));
//将studentVip转为zsStudentVip类型
zsStudentVip zsStudentVip = (zsStudentVip) studentVip;
//调用vip学生类特有的方法
zsStudentVip.isValid();
注意:向下转型是非常危险的,要谨慎使用,如果转型的类型不对,它不会立刻报错,而是在调用的时候报错,所以一定要确定类型在进行转型。
简单来说,向上转型就是表示子类是父类的一种,比如学生是人。反过来,向下转型就是在确定向上转型也就是确定学生是人的情况下,反过来验证这个人是学生。
重写和重载:
覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。
重载是指不同的函bai数使用相同的函数名,但是函数的参du数个数或类型不同。调用的zhi时候根据函数的参数来区别不同的函数。
这里我主要要讲的是重写,重写是为了增强类的重用性和复用性,扩展性;重写是对类中方法的扩充,因为继承用的是父类的东西,重写则不仅得到父类的东西,同时也加入了自己的东西提高代码灵活性,容易修改。
子类继承了父类,子类的行为大多和父类相似,但子类具有他自己方式,这就是重写的意义。
所以在更多情况下,重写也要比重载更加适用。(如果想要知道具体情况可以在cnds上自己查询)
五、总结
多态包含了很多,更实在Java中有着很大的作用,由于我的学习还不够深入,我也只能在浅显的以及我多少懂了一点的方面进行一定的描述,其中的应用更是少的可怜,如有更多需要,各位可以自行查阅其他文章。