多态中数据类型转换的注意点

一、多态弊端
父类不能使用子类特有成员。(需类型转换)

类型转换:
1、向上转型(自动类型转换,子类转换成父类)

Animal animal = new Dog();

2、向下转型(强制类型转换,父类转换成子类)

Dog dog = (Dog)animal;

二、数据类型转换注意点
1、只能在继承层次内进行转换,否则报类型转换异常(ClassCastException)

​2、将父类对象转换成子类前,使用instanceof检查

if(animal instanceof Dog) {
    Dog dog = (Dog)animal;
}

代码演示:
父类:Animal

/*
    父类动物类
 */
public class Animal {
    public void eat() {
        System.out.println("吃饭");
    }
}

子类:Dog和Cat

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

    //子类独有的方法,父类没有这个成员方法
    public void watch() {
        System.out.println("狗会看家看家");
    }
}
/*
    子类猫类
 */
public class Cat extends Animal {
}

测试类

/*
    测试类,多态类型转换的注意点
    只能在继承层次内进行转换,否则报ClassCastException异常
    所以将父类对象转换成子类时,先用instanceof进行检查  对象名 instanceof 数据类型
 */
public class Test {

    //main函数是程序的主入口,所有代码都是从这里开始的
    public static void main(String[] args) {
        //通过多态创建对象,调用子类的成员
        Animal animal = new Dog();

        //调用eat()
        animal.eat();

        //调用watch,子类特有,需要强转数据类型
        /*//正确写法
        Dog dog = (Dog)animal;
        dog.watch();*/

        /*//错误写法(错误理解狗是动物,猫是动物,猫是狗)
        //报类型转换异常ClassCastException
        Cat cat = (Cat)animal;*/

        //为了解决错误写法的发生,通过instanceof判断优化方案
        //判断当前对象如果是Dog类的对象,是则调用watch()方法
        if (animal instanceof Dog) {
            Dog dog = (Dog)animal;
            dog.watch();
        }

    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值