面向对象之多态
多态
事物在运行过程中存在不同的状态,多态存在三前提
1、要有继承关系
2、子类要重写父类的方法
3、父类引用指向子类
多态成员访问的特定:(编译时多态、运行时多态)
成员变量
编译看左边(父类),运行时看左边(父类)
成员方法
编译看左边,运行看右边(子类)。动态绑定(只有子类重写了父类的方法,运行时才看右边)
静态方法
编译看左边(父类),运行时看左边(父类)---静态和类相关,算不上重写,所以访问还是左边的
只有非静态的成员方法,编译看左边,运行看右边,即多态不能使用子类特定的属性和方法(多态中的向上转型)。编译是报错
怎么办呢?即强转(多态中的向下转型)---转型之后使用的是子类的属性和方法
举个通俗点的例子吧
花木兰替父亲花弧从军,征战王者荣耀,那么花木兰就是子类,花弧就是父类。花木兰有自己的成员属性年龄、姓名、性别。花弧同时也有这些属性,但是很明显两人的属性完全不一样。花弧有自己的非静态成员方法---技能"空裂斩",同时花木兰也遗传了父亲一样的方法---技能“空裂斩”。花弧、花木兰都有一个静态方法“自我介绍”,同时花木兰还有着一个父亲没有自己特有的非静态方法“化妆涂口红”,但是现在花木兰女扮男装征战荣耀巅峰,这相当于父类的引用(花弧这个名字)指向了子类对象(花木兰这个人),那么其他类(其他的人)访问子类对象(花木兰这个人)的成员属性(姓名、年龄、性别)时,其实看到的都是花木兰父亲的姓名(花弧)、年龄(50)、性别(男)。当访问子类对象(花木兰这个人)的非静态方法--技能“空裂斩”,其实看到的是花木兰用空裂斩在王者峡谷大杀特杀。当访问花木兰的静态方法时(自我介绍)。花木兰都是用父亲的名字信息在别人那做自我介绍。并且这个时候花木兰不能使用父亲没有自己特有的方法“化妆涂口红”。---多态中的向上转型
那么在花木兰展示高端操作,打破了明世隐的阴谋后,花木兰遇到了英俊潇洒、富可敌国的白马王子,这时候爱情的力量将父类对象的引用(花弧这个名字)强行转换成子类对象的引用(花木兰这个名字),那么花木兰又从新成为了她自己,那么那完全可以使用自己拥有的一切东西,可以化妆打扮,成功追上了她的白马王子,幸福过完一生。---多态中的向下转型。
使用多态好处的例子
打印结果:
学生类
老师类
好处:同一个方法,传入不同的对象,执行不同对象的相应方法,便于集中管理
就比如你们老板安排任务,他肯定说猪仔们今晚加班,而不是说张三、李四、王五。。。。加班,对吧小老弟。