多态性
多态前提和体现:继承、方法重写,父类引用指向子类对象(反之不行)
多态的好处:程序的扩展性提高,父类固定不变子类是可以无限扩展的;维护性提高
多态的弊端:不能访问子类的特有功能
多态的意义:一个类型的引用在指向不同的对象时会有不同的实现;
同样一个对象,造型成不同的类型时,会有不同的功能。
多态调用中编译和运行时期的特性:
非静态成员变量、静态成员变量:
编译时期,看父类中有没有这个变量,有编译成功,没有编译失败
运行时期,运行的是父类中的成员变量
非静态成员方法:
编译时期,看父类中有没有这个方法,有编译成功,没有编译失败
运行时期,运行的是子类重写后的方法
静态成员方法:
编译时期,看父类中有没有这个方法,有编译成功,没有编译失败
运行时期,运行的是父类中的方法(所以说静态方法不能算方法的重写)
总结:除非静态的方法以外,编译和运行都看父类;
只有非静态的方法,编译看父类,运行看子类。
多态调用中,方法必走子类重写
编译看左边,运行看右边
Fu f = newZi();
多态中的转型问题
向上转型:父类类型的引用指向子类对象;接口引用指向其实现类的对象
Java编译器根据类型检查调用方法是否匹配
向下转型(强制转型):
可以通过强制类型转换将父类型变量转换为子类型变量,前提是该变量指向的对象确实是该子类类型。
也可以通过强制类型转换将变量转换为某种接口类型,前提是该变量指向的对象确实实现了该接口。
如果在强制转换过程中出现违背上述两个前提,将会抛出ClassCastException
instanceof 关键字
为避免在强转中出现 ClassCastException 异常,可以通过 instanceof 关键字判断某个引用指向的对象是否为指定类型。
|
|