多态的优势和弊端

多态的优势

  • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
Person p = new Student();
p.look;//业务逻辑发生改变时,后续代码无需修改

业务逻辑发生变化时,只需要修改创建对象的语句,将 Student() 改为 Person 的子类来实现

  • 定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利
public class Main {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("aa");
    }
}

多态的优势

在利用方法的时候可以直接用父类型的参数。以 ArrayList 为例,ArrayList 作为一个容器可以直接不用泛型直接创建对象,表示所有类型都可以添加,添加内容是调用 add 方法时,直接用的是父类 Object 的 add 方法

多态的弊端

public class Main {
    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat();
        a.lookhome();
    }
}

class Animal {
    public void eat() {
        System.out.println("动物在吃东西");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗在吃骨头");
    }

    public void lookhome() {
        System.out.println("狗在看家");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫在吃小鱼干");
    }

    public void catchMouse() {
        System.out.println("猫在抓老鼠");
    }
}

不能去调用子类的特有功能

多态的弊端

原因:当调用方法的时候,编译看左边,运行看右边,在变异的时候会先检查左边的父类中有没有这个方法,如果没有直接报错

解决方案:进行类型转换,变成合适的子类类型

public class Main {
    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat();
        Dog d=(Dog)a; 
        d.lookhome();
    }
}

用类型转换的方式将其转化为合适的类型,然后就可以正常输出了

但是进行类型转换的时候也要注意装换后的类型

public class Main {
    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat();
        Cat d=(Cat) a;
        d.catchMouse();
    }
}

如果转换的类型发生错误,就会让代码直接报错

Exception in thread “main” java.lang.ClassCastException: class Dog cannot be cast to class Cat (Dog and Cat are in unnamed module of loader ‘app’)
at Main.main(Main.java:7)

该错误意味着类型转化错误,要转化为合适的类型

        if (a instanceof Dog) {
            Dog d = (Dog) a;
            d.lookhome();
        } else if (a instanceof Cat) {
            Cat c=(Cat) a;
            c.catchMouse();
        }else {
            System.out.println("类型不存在,转化失败");
        }

在类型较多的时候可以利用 if 判断语句进行判断,判断条件成立后将其转化为合适的类型

instanceof用法

在JDK 14以后的版本中可以简化

// 先判断 a 是否为 Dog 类型,如果是,则强转成 Dog 类型,转换之后变量名为 d
// 如果不是,则不强转,结果直接是 false
if (a instanceof Dog d) {
            d.lookhome();
        } else if (a instanceof Cat c) {
            c.catchMouse();
        } else {
            System.out.println("类型不存在,转化失败");
        }

总结

  1. 多态的优势

方法中,使用父类作为参数,可以接收所有子类对象

  1. 多态的弊端是什么

不能使用子类的特有功能

  1. 引用数据类型的类型转换,有几种方式

自动类型转换,强制类型转换

  1. 强制类型转换能解决什么问题
  • 可以转换为真正的子类类型,从而调用子类独有的功能
    多态的优势

方法中,使用父类作为参数,可以接收所有子类对象

  1. 多态的弊端是什么

不能使用子类的特有功能

  1. 引用数据类型的类型转换,有几种方式

自动类型转换,强制类型转换

  1. 强制类型转换能解决什么问题
  • 可以转换为真正的子类类型,从而调用子类独有的功能
  • 类型转换与真实对象类型不一致会报错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

都不会的鲨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值