美文网首页
多态的弊端

多态的弊端

作者: Chris_Qyh | 来源:发表于2018-06-03 23:47 被阅读0次

    多态的弊端和解决

    弊端:

    不能实现子类特有的功能

    解决方法:

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

    相关文章

      网友评论

          本文标题:多态的弊端

          本文链接:https://www.haomeiwen.com/subject/wsgssftx.html