一文读懂之java多态转型

多态转型,其实类似于基本数据类型转型。
基本数据类型:
大类型转小类型(不安全)需要强转。
小类型转大类型(安全)自动转化。
多态转型也类似。我们通过代码来理解:
首先定义一个父类Animal

class Animal{
    void eat(){
        System.out.println("动物会吃饭!");
    }
}

然后定义子类Dog和Cat

class Dog extends Animal{
    @Override
    void eat() {
        System.out.println("狗爱吃骨头!");
    }
    void watchDoor(){
        System.out.println("狗能看家护院!");
    }
}
class Cat extends Animal{
    @Override
    void eat() {
        System.out.println("猫爱吃鱼!");
    }
    @Override
    void catchMouse(){
        System.out.println("猫能抓老鼠!");
    }
}

通过以上例子来引入多态的向上转型和向下转型
对象的向上转型,即将子类对象,转成作为父类使用,这是安全的。为什么是安全的,比如我们上边的例子,父类Animal拥有的功能吃,子类Dog也拥有,所以是安全的。一文读懂之java多态转型_第1张图片
可以访问父类吃的功能输出的是子类的吃的功能。在这里插入图片描述
向下转型:
当Animal想使用子类特有的功能时是不安全的。比如狗会看门。但是不一定所有的动物都会看门。一文读懂之java多态转型_第2张图片
报错,因为该狗是被new出来当动物去了,但是动物Animal不具有看门的功能。
**总结:**此处的功能始有引用对象类型决定的而不是实际。
因此我们需要强制向下转型。
将new出来的这条动物狗,强转成实际狗
在这里插入图片描述
没问题,不报错了,但是我们上边说过向下强转是不安全的,怎么就不安全了呢?

Animal a1=new Cat();
        Dog a2=(Dog)a1;
        a2.watchDoor();

我们将猫作为Animal,然后将这个Animal强转成狗,去调用狗的功能时,是不会报错的。
但是运行之后却会报如下异常:即猫不能强转为狗

java.lang.ClassCastException: Cat cannot be cast to Dog

但是当我们想父类想用子类的功能呢?
我们需要加一个判断,判断引用对象是不是实际对象的对象。用instanceof语句一文读懂之java多态转型_第3张图片

—最后:
总结一下:
1:自动向上类型转换: 安全的。
父类引用指向子类对象。

2:强制向下类型转换: 有安全隐患。
把一个父类类型的引用,转换为一个子类对象的引用使用。
当希望父类的引用指向子类对象的时候,只能访问父类中存在的方法,如果想调用子类中特有的功能的时候,需要向下强转。

3、对象引用的访问的功能,是引用的声明类型决定的,而不是对象的实际类型。

你可能感兴趣的:(java,一文读懂系列)