多态(动态绑定机制):
概念:某一对象(事物),在不同时刻表现出来的不同状态
猫 m = new 猫();
动物 d = new 猫(); 猫是动物的一种,可以把猫称为动物
多态的前提和体现:
a.有继承关系
b.有方法重写
可以没有重写,但是没有重写,多态就没有意义
不同的状态有不同的表现,所以要有重写
c.有父类引用指向子类对象
父 f = new 子();
(***)多态中的成员访问特点:
A.成员变量:
编译看父类(父类中是否有该变量),执行看父类
(成员变量作为属性, 是事务的描述信息, 不能改变
父类的描述信息不能改变)
B.构造方法
创建子类对象的时候,访问父类的构造方法,对父类数据进行初始化
C.成员方法
编译看父类(父类中是否有该方法),执行看子类
(由于成员方法存在方法重写,所有执行的时候要看子类的该方法)
D.静态方法
编译看父类,执行看父类
(静态方法是类成员,算不上重写,所以执行的时候依然访问父类方法)
动态绑定: 编译的时候, 首先查看左边父类中是否有该成员,
运行的时候,动态地绑定到子类的方法上
多态的好处:
a.提高了代码的维护性(继承保证)
b.提高了代码的扩展性(由多态保证)
把父类名作为形式参数, 传递子类实参
多态的弊端:
不能使用子类的特有功能.
解决方法:
a.创建子类对象(不合理,且占内存)
b.把父类的引用强制转换为子类引用(向下转型)
Zi z = (Zi)f
对象间的转型问题:
向上转型:
Fu f = new Zi();
(**)向上转型少用, 开发中多用把父类名作为形式参数
向下转型:
Zi z = (Zi)f;
向下转型的目的:
使用子类特有的功能
ClassCastException 类转换异常: 多态中向下转型中出现的类型不铺配
多态的类型:
具体类多态(几乎不用)
抽象类多态(常用)
接口多态(最常用)
|
|