多态中对象的上下转型

向上转型:
由子类转换成为父类,在继承图上是向上移动的,称之为向上转型。
特点:
1、首先是安全的,但是可能会导致子类的方法的丢失。
2、父类的引用指向子类的对象
与之相反的是向下转型
特点:
1、不安全,向下转型的时候首先需要向上转型
2、子类的对象指向父类的引用

class Animal{
    String name;
    public Animal(String name){
        this.name=name;
    }
    public void eat(){
        System.out.println("我有吃的方法");
    }
}
class Cat extends Animal{

    public Cat(String name) {
        super(name);
    }
    public void eat(){
        System.out.println("猫吃鱼");
    }
    public void swimming(){
        System.out.println("我会游泳");
    }
}
class Dog extends Animal{

    public Dog(String name) {
        super(name);
    }
    public void shout(){
        System.out.println("我会叫");
    }
}
public class DuoTaiDemo {
    public static void main(String[] args) {
        //向上转型,首先是安全的 ,但是会导致子类的方法的丢失,因为引用只会调用到子类重写父类的方法或者是父类本身已有的方法,子类自己的方法不会被调用到
        Animal a1= new Cat("我是猫");
        //Animal a2=new Dog("我是狗");
        //向下转型,第一部首先是其向上转型。特点:是不安全的 ,因为系统不会知道引用到底是指向的哪一个子类
        Cat cat=(Cat) a1;
        cat.swimming();
        //但是这样就会报错,因为狗指向了猫,相当于把狗转换成为了猫,但是编译不会报错,执行之后会报异常
        /*Dog dog= (Dog) a1;
        dog.shout();*/  
        //执行之后回报 java.lang.ClassCastException异常,处理方法:instanceof运算符
        //instanceof运算符用来在运行是返回一个布尔值来指出对象类是否是特定类或者是他的子类的一个实例
        /**用法:
         * result=object instanceof class
         * result:布尔类型
         * object:必选项,任意对象表达式
         * class:必选项:任意已定义的对象类
         * 说明:如果object是class或者其定义的一个实例,则result返回true,如果不是或者object是null,则返回一个false
         */
        //看引用是否指向狗,没有指向的话就不会执行,也就不会报错
        if (a1 instanceof Dog) {
            Dog dog= (Dog) a1;
            dog.shout();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值