多态的弊端和解决
弊端:
不能实现子类特有的功能
解决方法:
法1.创建子类对象调用子类方法(无法使用多态)
法2.把父类的引用强转为子类引用(向下转型)
强制转化的风险
强制转化,如果父类的引用本身不是指向子类对象的,那么就会出现ClassCastException异常
避免方法
引入instanceof运算符,判断对象所属的类型
对象a instanceof 类名A
表达式含义:判断某个对象是否是某个类
表达式的结果是一个boolean值:true or false
注:null对象引用虽然与所有引用类型兼容,但null不是任何类型的实例,因此 null instanceof <类名>的结果永远是false
赋值兼容性规则:
1.对引用类型的变量进行赋值操作时,赋值号右边的表达式类型 必须与 左边的对象引用类型 相同或是其子类型 (赋值类型兼容)
2.方法的return语句返回值类型 必须与 方法声明中的返回类型 相同或是其子类型(返回值类型兼容)
3.null值与所有的引用类型兼容,所有引用类型的变量都可被赋值为null
向上转型
把子变成父 父类引用指向子类实例
向下转型
把父转成子 子类引用指向父类实例 (要求父类的引用本来就指向子类对象)
向下转型的前提条件是向上转型
public class Demo1 {
public static void main(String[] args) {
//父类引用指向子类实例
Animal cat = new Cat();
//编译看左边,一旦使用了多态就无法再调用子类特有的方法
//cat.maiMeng();//编译错误
//解决方案2:向下转型
// 默认情况下,jvm是不允许的。
// 因为,Animal类型的引用,它既可以指向一个Animal对象,也可以指向一个Animal子类Cat的对象
// 但可以通过强制转化的方式,访问到子类所特有的方法
Cat c = (Cat) cat;
c.maiMeng();
Animal a = new Animal();
transer(a);
Animal b = new Cat();
transer(b);
// null值与所有的引用类型兼容,所有引用类型的变量都可被赋值为null
Animal an = null;
Cat cat2 = null;
}
public static void transer(Animal a) {
//当需要做强制转化的时候,首先利用instanceof运算符,判断一下,当前a是否是Cat
if(a instanceof Cat) {
//如果a是Cat类的对象
Cat c = (Cat) a;
c.maiMeng();
}
}
}
class Animal {
}
class Cat extends Animal {
public void maiMeng() {
System.out.println("mai meng");
}
}
网友评论