对象的向上转型和向下转型

接上一篇:https://blog.csdn.net/green703338130/article/details/81028819

对象的向上转型

对象的向上转型,就是多态的写法。
格式:
父类名称 对象名 = new 子类对象名称(); Animal animal = new Cat();
含义:
右侧创建一个子类对象,把它当做父类来看。
注意事项
向上转型一定是安全的,从小范围转换成为大范围。
类似于:double num = 100;int --> double,自动类型转换。

抽象类

public abstract class Animal {
    public  abstract void eat();
}

子类

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

主方法

public class Demo01Main {
    public static void main(String[] args) {
        //对象的向上转型,就是:父类对象引用指向子类对象。
        Animal animal = new Cat();
        animal.eat();
    }
}

对象向下转型

向上转型的弊端

虽然向上转型是安全的,但是对象一旦向下转型,那么就无法调用子类原本的特有的方法,为此这里引入向下转型转型来还原。
格式:
子类名称 对象名 = (子类名称) 父类对象;
含义:将父类对象(还原)成为本来的子类对象。
Animal animal = new Cat(); //本来就是猫,向上转型成为动物。
Cat cat = (Cat)animal; //本来就是猫,已经被转型为动物。还原回来成为本来的猫。
注意事项:

  • 必须保证对象本来创建的时候,就是猫,才能向下转型成为猫。
  • 如果对象创建的时候本来不是猫。现在非要向下转型成为猫,就会报错。

Animal.java

public abstract class Animal {

    public  abstract void eat();
}

Cat.java

public class Cat extends  Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
     public void catMouse() {
         System.out.println("猫抓老鼠");
     }
}

Dog.java

public class Dog extends  Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
    public void watchHouse() {
        System.out.println("狗看家");
    }
}

主方法Demo01Main.java

public class Demo01Main {
    public static void main(String[] args) {
        //对象的向上转型,就是:父类对象引用指向子类对象。
        Animal animal1 = new Cat();//本来创建的时候是一只猫
        animal1.eat();
//        animal1.catMouse();//错误,父类无法访问子类方法
        //向下转型,进行还原动作
        Cat cat = (Cat) animal1;
        cat.catMouse();
        System.out.println("----------我是分割线--------");
        /*
        下面是错误的向下转型
        本来new的时候是一只猫,然后向下转型成为狗
         */
        Animal animal2 = new Cat();//原本是一只猫
        Dog dog = (Dog) animal2;//编译不会报错,但是运行的时候报错:java.lang.ClassCastException,类转换异常。
    }
}

instanceof在向下转型中的应用

在向下转型时,不知道父类引用的是什么类型的子类,就会发生错误,这时可以使用instanceof来解决这个问题。
格式:
对象 instaceof 类名称
这将会返回一个boolean值结果,也就是判断前面的对象能不能当做后面类型的实例。

public class Demo01Instanceof {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.eat();

        //如果希望调用子类的特有方法,需要向下转型。
        //判断父类引用animal是不是Dog
        if(animal instanceof Dog) {
            Dog dog = (Dog) animal;
            dog.watchHouse();
        }
        //判断父类引用animal是不是Cat
        if(animal instanceof  Cat) {
            Cat cat = (Cat)animal;
            cat.catMouse();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/green703338130/article/details/81032055