面向对象之多态---类型的转换与判断

对象的向上转型

格式: 父类名称 对象名 = new 子类名称();

Animal animal = new Cat();

创建了一只猫,当作动物来看待,没问题

含义: 右键创建一个子类对象,把它当作父类来看待使用

向上转型一定是安全的

类似于 double num = 100; / / 正确

// 抽象父类Animal
public  abstract  class Animal {
    public abstract void eat();
}

// 子类Cat重写eat方法
public class Cat extends Animal {

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

// 向上转型一定是安全的,没有问题的,正确的,但是也有一个弊端
// 对象一旦向上转型为父类,那么久无法调用子类原本特有的内容(子类特有方法)

// 解决方案: 用对象的向下转型【还原】
public class Main {
    public static void main(String[] args) {

        //对象的向上转型,就是,父类引用指向子类对象。
        Animal animal = new Cat();
        animal.eat();
    }
}

对象的向下转型

对象的向下转型,其实就是一个【还原】的动作

格式: 子类名称 对象名 = (子类名称) 父类对象;

含义:将父类对象,[还原]成为本来的子类对象

Animal animal = new Cat() // 本来是猫,向上转型成为动物

Cat cat = (Cat) anmial // 本来是猫,已经被当做动物了,还原成为本来的猫

Dog dog = (Dog) animal // 错误,因为对象创建的时候本来不是狗而是猫

注意事项:

1. 必须保证对象本来创建的时候,就是猫,才能向下转型成本来的猫

2. 如果对象创建的时候本来不是猫,现在非要向下转型成为猫,就会报错(java.lang.ClassCastException 类转化异常)

类似于: int num =(int) 10.0; // 可以 int num = (int) 10.5; //不可以,精度损失

// Ctrl + O 快速重写父类方法
// 这是Animal的另一个Dog子类
public class Dog  extends  Animal{
    @Override
    public void eat() {
        System.out.println("狗吃Shit");
    }
    public void watchHouse(){
        System.out.println("狗看家");
    }
}

用instanceof关键字来进行类型判断

/**
 * 如何才能知道一个父类引用的对象,本来是什么子类?
 *
 * 格式:
 *
 * 对象 instanseof 类名称
 *
 * 这将会得到一个boolean值结果,也就是判断前面的对象能不能当做后面类型的实例。
 */
public class Instanseof {
    public static void main(String[] args) {
        Animal animal = new Cat() ;//向上转型,本来是一只猫
        animal.eat(); // 猫吃鱼

        // 希望调用子类特有方法,需要向下转型
        // 判断一下父类引用animal本来是不是Dog
        if(animal instanceof Dog){
            Dog dog = (Dog) animal;
            dog.watchHouse();
        }
        if(animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }
        System.out.println("=======");
        // 调用方法
        // 宠物猫方法
        giveMeAPetCat(new Cat());
        System.out.println("=======");
        // 宠物狗方法
        giveMeAPetDog(new Dog());
    }
    // 宠物猫
    public static void giveMeAPetCat(Animal animal){
        if(animal instanceof  Cat){
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }
        if(animal instanceof  Dog){
            Dog dog = (Dog) animal;
            dog.watchHouse();
        }
    }
    // 宠物狗
    public static void giveMeAPetDog(Animal animal){
        if(animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }
        if(animal instanceof Dog){
            Dog dog = (Dog) animal;
            dog.watchHouse();
        }
    }
}


posted @ 2020-05-25 20:28  FenixG  阅读(267)  评论(0编辑  收藏  举报