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

接上一篇: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 {
    int a = 10;

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
     public void catchMouse() {
         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.a;//错误,父类无法访问子类的成员变量
//        animal1.catMouse();//错误,父类无法访问子类方法
        //向下转型,进行还原动作
        Cat cat = (Cat) animal1;
        cat.catchMouse();
        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.catchMouse();
        }
    }
}
  • 11
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值