【**写在开始!多态没我写的那么简单,里面还有很多的小细节要注意,比如遇到多态强转时遇到ClassCastException 错误怎么解决,这些都是需要知道的。本小文内容只是作为对多态的了解。如果你是大佬,直接略过叭**】
一、概念
多态:顾名思义就是 多种状态嘛(大白话)。翻译为专业语句是 同一个对象,在不同时刻表现出来的不同形态。
那么为什么会有多态?又怎么使用?
为什么会有?一个项目系统中,针对于同一对象有两种不同的表现类型,导致代码耦合度过高;多态好处在于降低类之间的耦合性(耦合性:类与类之间的关系过于紧密),提高代码复用性和可维护性。
又怎么使用?------------往下看
实现步骤:(先了解,继续往下看)
1、创建一个工厂类(如:StudentDaoFactory 类)
2、类中提供由static 修饰的方法,在方法中创建对象并返回。(如:return new StudentDao( ) )
二、实现多态的前提条件
- 有继承(extends)或实现(implements)关系
- 有方法重写
- 有父类引用指向子类对象
【别忘了,我们为什么要有多态!!多想想多态出现的原因~】
三、多态中成员访问特点
构造方法:同继承一样,子类会通过super 访问父类构造方法
成员变量:编译看左边(父类),执行看左边(父类)
成员方法:编译看左边(父类),执行看右边(子类)
【因为成员方法中有重写覆盖了父类中的方法。而成员变量没有重写功能,所有成员方法执行看右边】
项目描述:通过 a 打印输出父类中的 age 成员变量。即 编译和执行都看 Animal 父类中是否有该属性,所有 输出结果时 是Animal 中的 20 而非 Cat 子类中的 10;
执行结果:
成员方法同理(懒得写!)
四、多态的好处和弊端
好处:提高了程序的扩展性。具体体现在定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的任意子类对象。
弊端:不能使用子类的特有功能。
执行结果:
至于 【弊端:不能使用子类的特有功能】,是因为 多态使用成员方法时编译看左边,当父类中没有子类中的特有的成员内容时,肯定在编译时就 直接爆红噻~~
五、多态中的转型
为什么会有转型呢?因为当父类没有子类特有的成员内容,但又不得不要使用时,就有了转型的解决方案之一!!!
- 向上转型( 多态创建对象的一般方法;以上main方法中 创建对象的方式都是,此处省略代码展示 )
从子到父
父类引用指向子类对象
- 向下转型 ( 强制转换 )
从父到子
父类引用转为子类对象
代码演示: (play 是Cat 子类中特有的方法。向下转型,然后通过子类对象 调用。完美解决!)