1.1.多态(掌握)
多态时面向对象三大特征:封装、继承、多态。
在继承关系,是一种”isA”的关系,也就说子类是父类的一种特殊情况,有如下代码:
那么我们可以认为狗和猫都是一种特殊的动物,那么可以使用动物类型类来表示狗或猫。
此时对象(a)具有两种类型:
n编译类型:声明对象变量的类型——Animal
n运行类型:对象的真实类型——Dog
当编译类型和运行类型不一致的时候,此时多态就产生了:
注意:编译类型必须是运行类型的父类或接口。
所谓多态,表示一个对象具有多种形态。
多态的前提,可以是继承关系(类和类),也可以是实现关系(接口和实现类),在开发中,一般都指接口和实现类之间的关系,什么是多态?
一言以蔽之:父类引用变量指向于子类对象,调用方法时实际调用的是子类的方法。
我家有一种动物,你猜它的叫声是怎么样的,猜不到,因为这个动物有多种形态。
n如果该动物是狗,叫声是:旺旺旺
n如果该动物是猫,叫声是:妙妙妙
多态操作有两种定义格式和操作语法:
n操作继承关系(开发中不是很多):
n操作实现关系(开发中最频繁):
1.1.1.操作继承关系(掌握)
接口变量名=new实现类();
变量名.方法();
Animal类:
Cat类:
Dog类:
测试类:
运行结果:
验证结论:父类引用变量指向于子类对象,调用方法时实际调用的是子类的方法。
1.1.2.操作实现关系(重点掌握)
ISwimable接口:
Fish类:
测试类:
运行结果:
1.1.3.多态时方法调用问题(重点掌握)
把子类对象赋给父类变量,此时调用方法:
那么a对象调用的shout方法,是来自于Animal中还是Cat中?判断规则如下:
一张图,看懂到底调用的是哪一个类中的方法!
文字解释,先判断shout方法是否在父类Animal类中:
找不到:编译报错
找到:再看shout方法是否在子类Cat类中:
找不到:运行父类方法
找到:运行子类方法(这个才是真正的多态方法调用)
1.1.4.类型转换和instanceof运算符(了解)
自动类型转换:把子类对象赋给父类变量(多态)
强制类型转换:把父类类型对象赋给子类类型变量(前提:该对象的真实类型应该是子类类型)
instanceof运算符:判断该对象是否是某一个类的实例,在开发中运用不是很多
代码如下:
1.1.5.多态的好处-USB案例(掌握)
需求:模拟在主板上安装鼠标、键盘等,比较没有规范和有规范的区别。
没有统一规范:
鼠标类:
键盘类:
主板类:
上述代码是没有统一规范的,我们能发现其中的问题:
n不同设备中工作的方法名称是不一致的
n每次需要安装中设备,都需要在主板类上新增一个方法(这个问题严重)
没有统一规范:
USB规范接口:
在Mouse和Keyboard类遵循于USB规范——工作的方法名称也就相同了。
主板类,在安装方法plugin上也体现出了多态的特征:
面向接口编程,体现的就是多态,其好处:把实现类对象赋给接口类型变量,屏蔽了不同实现类之间的实现差异,从而可以做到通用编程。
测试类,无论是否使用多态,测试代码相同:
请问:使用USB接口后,哪里出现多态了?





