Java多态的优势和弊端

1.多态的优势:

1.在多态形式下,右边对象可以实现解耦合,便于扩展和维护

Person p=new Student();

p.work();//业务逻辑发生改变时,后续代码无需修改,只改上边的new Student就可以了

2.定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利

2.多态的弊端:

不能使用子类的特有功能

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

自动类型转换:Person p=new Student();

强制类型转换:Student s=(Student)p;

4.强制类型转换能解决什么问题:

可以转换成真正的子类类型,从而调用子类独有功能

转换类型与真实对象类型不一致会报错

转换时用instanceof关键字进行判断

示例:

细节:转换的时候不能瞎转,如果转成其他类的类型就会报错
//Cat1 c=(Cat1)a;//运行时会报错
//解决方法:能不能有一个在转换时判断一下呢
//能:instanceof
package a02polymorphismdemo2;

public class Test1 {
    public static void main(String[] args) {
        //多态方式创建对象
        Animal1 a=new Dog1();
        //编译看左边,运行看右边
        a.eat();

        //多态的弊端
        //不能调用子类的特有功能
        //当调用成员方法时:编译看左边,运行看右边
        //那么在编译的时候会先检查左边的父类中有没有这个方法,如果没有直接报错
        //a.lookHome();//报错

        //解决方案
        //把调用者a再变回子类类型就可以了
        //Dog1 d=(Dog1)a;
        //细节:转换的时候不能瞎转,如果转成其他类的类型就会报错
        //Cat1 c=(Cat1)a;//运行时会报错
        //解决方法:能不能有一个在转换时判断一下呢
        //能:instanceof
//        if(a instanceof Dog1){
//            Dog1 d=(Dog1)a;
//            d.lookHome();
//        }else if(a instanceof Cat1){
//            Cat1 c=(Cat1)a;
//            c.catchMouse();
//        }else{
//            System.out.println("没有这个类型,无法转换");
//        }
        //JDK14之后出现了一个新特性:把判断和强转两个合在一起写
        //先判断a是否为Dog1类型,如果是则强转成Dog类型,转换之后变量名为d
        //如果不是,则不强转,结果直接是false
        if(a instanceof Dog1 d){
            d.lookHome();
        }else if(a instanceof Cat1 c){
            c.catchMouse();
        }else{
            System.out.println("没有这个类型,无法转换");
        }
    }
}
class Animal1{
    public void eat(){
        System.out.println("动物在吃东西");
    }
}
class Dog1 extends Animal1{
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
    public void lookHome(){
        System.out.println("狗看家");
    }
}
class Cat1 extends Animal1{
    @Override
    public void eat() {
        System.out.println("猫吃小鱼干");
    }
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值