多态的弊端

多态的弊端和解决

弊端:

不能实现子类特有的功能

解决方法:

法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");
   }
}

你可能感兴趣的:(多态的弊端)