多态的前提条件 :
- 要有继承实现关系
- 要有方法重写
- 要有父类引用执行子类对象
class Fu { int num = 10; public void show(){ System.out.println("show...fu"); } } class Zi extends Fu { int num = 20; @Override public void show(){ System.out.println("show...Zi"); } }
多态创建对象, 调用成员变量 :
- 编译看左边(父类), 运行看左边(父类)
Fu f = new Zi(); System.out.println(f.num); // 10 原因: 当前是父类的引用, 所以访问的空间就很局限, 只能看到堆内存中, super那块空间的数据
多态创建对象 : 调用成员方法 :
- 编译看左边 (父类), 运行看右边(子类)
Fu f = new Zi(); f.show(); // show...Zi 问题: 为什么一定会执行子类的逻辑呢? 回答: 担心父类的方法, 是一个抽象方法, 抽象方法没有逻辑可以执行.多态的好处和弊端
好处 :
- 提高了代码的扩展性 :
将方法的形参, 定义为父类类型, 这个方法, 就能够接收该父类的, 任意子类对象了. public static void useAnimal(Animal a){ a.eat(); } useAnimal(new Dog()); useAnimal(new Cat());
弊端 :
-
不能调用子类特有的成员 (变量, 方法)
-
解决方案 :
- 重要的思路 : 如果你的目标, 只是为了调用子类特有的内容, 干脆直接创建子类对象去 !
- 一般多态创建对象之后, 只会调用共性的内容
- 另外的方案 : 向下转型
- 重要的思路 : 如果你的目标, 只是为了调用子类特有的内容, 干脆直接创建子类对象去 !
向上转型 :
- 父类引用指向子类对象
Fu f = new Zi();
向下转型 :
- 从父类的引用那里, 转换回子类的类型
Zi z = (Zi)f;
转型中的安全隐患问题 :
- ClassCastException : 类型转换异常
- 在引用数据类型当中, 实际类型和目标类型不匹配, 就会出现此异常
Animal a = new Dog(); Cat c = (Cat)a; // ClassCastExceptioninstanceof 关键字
- 作用:可以避免,多态线下转型的安全隐患
- 介绍:判断左边的应用,是否是右边的类型
if(a instanceof Dog){ }else if(a instanceOf Cat){ }多态的的使用
-
调用别人写好的方法:
思路 : 如果调用方法的时候, 发现人家管我要的是一个接口, 那我就应该传入实现类对象 -
自己设计多态的方法:
可以将方法的形参定义为父类类型,这个方法就能接收任意子类对象了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)