目录
学习背景
地点:长沙欧富安科技园1栋5楼飞思
时间:23年7月10~16号
前言
众所周知,Java有三要素即,封装,继承和多态。本次要总结的内容就是多态,将从什么是多态,多态的实现,和多态的使用等几个方面来简单阐释一下。
什么是多态?
字意如其形,多态,多态也就是多种形态。例如生活中的多态就是多样化,猫与猫之间的不同,习俗与习俗之间的不同,人与人之间的不同等等。
而代码之中的多态就是指,同一父类的各种子类类型的对象,执行相同的方法,得到结果不一样(父类引用子类对象 ==> 父类类型接收子类对象 )也可以说是,(同一父类的,不同子类类型,的对象),执行相同的方法(重写父类的),得到结果不一样。
多态的实现
由上述多态的定义可知,想要实现多态,则必须继承父类,并重写父类中的方法,故利用继承和重写就能实现多态
当也由上可知,多态的使用会涉及到父类类型和子类对象,就会涉及到向上,向下转型问题这个我们稍后再总结。首先我们得知道两个概念,即,真实类型与表面类型
Father son = new Son();
此时son的表面类型为Father,而真实类型为Son
总结出:
真实类型:Father ==>子类调用父类方法 ==>重写的
表面类型:Son ==>子类调用本身方法 ==>特有的
多态的使用
案例:女孩喂养宠物
涉及到的类:女孩,狗,猫,企鹅,宠物,测试
女孩中喂养宠物的方法(不使用多态)
分析问题:
喂养方法,大致一样,存在代码重写
新添加新的宠物类, 软件设计原则: 开闭原则(对添加开放, 对修改关闭), 违背开闭原则,每一次新加一个宠物,都需要修改Lady类
创建一个新宠物类
继承Pet类
重写方法
修改Lady类, 新添加一个喂养方法 违背开闭原则
解决方案: 使用多态
总结多态的使用方式:
-
父类类型作为参数类型
-
父类类型作为返回值类型
注意事项
多态的三要素:
-
要有继承
-
使用父类变量接收子类对象
-
要有方法重写
向上,向下转型
当我们使用多态时必定会出现的现象,即向上,向下转型问题,为什么会出现这样的问题在上面已经总结出来了。
向上转型
把子类对象赋值给父类变量, 自动类型转换
好处: 多态的实现
缺点: 只能调用父类存在的方法与属性, 无法调用子类特有属性和方法
使用场景:
实现多态
屏蔽子类的特有方法,只操作父类通用方法, 方便子类的替换
Father son = new Son();
向下转型
把父辈类的转换为子类类型, 需要强制类型转换
子类 变量 = (子类)父类变量;
好处: 调用子类特有属性和方法
缺点: 可能出现 ClassCastException(类型转换异常),真实类型不匹配
Son son = (Son) Son;
Pet p = new Dog();
Cat cat = (Cat)p; //报ClassCastException: 类型转换异常
解决向下转型的问题:
java提供的一个关键字: instanceof 语法: 变量 instanceof 类类型 表达式结果: boolean
true: 变量是类类型的一个对象或者类类型 的子类对象
false: 否则
Pet p = new Dog();
System.out.println(p instanceof Pet); //true
System.out.println(p instanceof Dog); //true
System.out.println(p instanceof Cat); //false