多态的优势和弊端

多态的优势

  • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
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. 强制类型转换能解决什么问题
  • 可以转换为真正的子类类型,从而调用子类独有的功能
  • 类型转换与真实对象类型不一致会报错
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
多态是面向对象编程中的一个重要概念,它允许使用父类类型的变量来引用子类类型的对象。多态具有以下优势弊端优势: 1. 可扩展性:多态使得程序更加灵活和可扩展。通过定义通用的父类类型,可以在不修改现有代码的情况下添加新的子类类型。 2. 可替换性:多态使得代码更具有可替换性,可以在运行时动态地替换对象的实际类型。这意味着可以通过改变对象的具体实现类来改变程序的行为。 3. 代码复用:多态可以提高代码的复用性。通过将代码与具体的实现类解耦,可以更好地实现模块化和重用。 弊端: 1. 性能损失:多态需要在运行时进行类型检查和动态绑定,可能会导致一定的性能损失。相比于直接调用具体类型的方法,多态的方法调用可能需要更多的时间。 2. 可读性下降:多态的使用可能会导致代码的可读性下降。由于多态的对象类型在编译时无法确定,需要进行一些额外的推理和理解。 3. 隐藏细节:多态可能会隐藏子类的细节,使得代码更加抽象和难以理解。这可能会导致一些潜在的问题被掩盖,增加调试和维护的难度。 总的来说,多态在面向对象编程中具有重要的优势,但也需要在适当的时候进行权衡和使用。合理地利用多态可以提高代码的灵活性和可维护性,但过度使用可能会带来一些性能和可读性的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

都不会的鲨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值