09 多态
1 多态
1.1 为什么要使用多态?
软件架构过程中,有一个开闭原则:对修改关闭,对扩展开放。
当我们需要升级业务时,业务的拓展不应该导致程序或者程序架构做过大调整。
1.2 多态
1.2.1 多态的概念
生活中,存在这种现象
同一个人拍照,由于选用的拍照设备不同,产生的照片不同。
同一事物,由于条件不同,产生结果也不同。
多态就是事物呈现的多种状态。
在程序中,多态是指
多态:同一个引用类型,使用不同的实例而执行不同操作
public class Test01 { public static void main(String[] args) { // 多态:同一引用类型,不同实例,执行结果不同 // java中的多态要求:父类类型引用子类对象 Animal animal = null; animal = new Person(); animal.sleep(); animal = new Fish(); animal.sleep(); } }
总结:
[1] 多态是指 同一引用类型,由于实例化的实例不同,导致对同一方法的执行结果不同。
同: 同一引用类型
不同: 实例化的实例
同:同一方法,该方法一般都会被重写。
不同: 执行结果不同
[2] java多态要求一定是父类引用=子类对象
父类类型 父类对象 = new 子类类型()
1.1.1 多态的表现形式
[1] 本质:父类引用子类对象
[2] 父类对象作为方法形参
public void feed(Pet pet) { System.out.println("主人在喂" + pet.getName()); pet.eat(); }
[3]父类作为方法返回值实现多态
public Pet getPet(int type) { Pet pet = null; switch(type) { case 1:{ pet = new Dog();break; } case 2:{ pet = new Penguin();break; } case 3:{ pet = new Cat();break; } } return pet; }
1.1 多态中类型转换
1.1.1 自动类型转换
子类可以无条件转换为父类类型,也称为向上类型转换
父类类型 父类引用 = 子类对象
1.1.2 强制类型转换
当父类想调用子类特有方法时,一定要进行强制类型转换,也称为向下类型转换
子类类型 子类对象= (子类类型)父类对象
Dog dog = (Dog)pet;
Penguin penguin = (Penguin)pet;
注意:强制类型转换有个前提:一定要转换为父类对象引用的实际的子类类型。
obj instanceof Class/Interface 判断对象是否是类或者接口的实例。
public class Test01 { public static void main(String[] args) { Dog dog = new Dog(); System.out.println(dog instanceof Dog); System.out.println(dog instanceof Pet); System.out.println(dog instanceof Object); } }
1.1 总结
多态的好处:
提高了程序的可拓展性和可维护性。
多态三种表现形式
[1] 父类引用子类对象
[2] 父类作为方法形参
[3] 父类作为方法返回类型
多态发生的条件
[1] 必须有继承
[2] 有重写/实现
[3] 父类引用子类对象
多态过程中,需要调用子类特有的方法
类型转换/instanceof
多态的分类(C)
编译时多态:指重载
运行时多态:多态,具体到运行时才知道父类对象引用的是哪个子类。
思考题:java是如何实现运行时多态?
动态绑定和静态绑定
1.2 调试技巧
断点:程序执行时的停止的点。
step over: 单步执行。执行一句当前的代码
step into: 进入方法体继续执行。