【Java基础】向下转型的使用

问题:
在体现多态性时,用父类引用指向了子类对象。
Person p1 = new Man();
在编译时,p1只能调用Person类型的属性和方法。
但是在堆内存中实际上是有Man类型特有的属性和方法的(因为new过了)
如何让p1调用Man类型的属性和方法而不报错呢?

(书面语版本的这个问题)
有了对象多态性后,内存中实际上是加载了子类特有的属性和方法的。
但是由于变量声明为父类类型,导致编译时,
只能调用父类的变量和方法,
子类特有的属性和方法不能调用。

解决方法:对于编译器来讲,让p2转为子类类型。
使用强制类型转换符–向下转型

Man m1 = (Man)p1;

低级到高级自动,高级到低级手动(“拉下神坛”)
经过强制转换后,编译器方面可以通过。
但是运行时不一定通过,可能会出现ClassCastException。

        Man m1 = (Man)p2;
        m1.earnMoney();//可以通过运行
        
        Woman m2 = (Woman)p2;
        m2.goShopping();
        //编译器没有报错
        //运行时会报错

为了避免出现这种类型转换异常的问题,引入instanceof关键字。

a instanceof A:判断a是否是类a的一个实例
可使用如下形式代码块:

   if(p2 instanceof Woman) //false
        {
            Woman m2 = (Woman)p2;
            m2.goShopping();
            System.out.println("转换成功!");
        }

如果a instanceof A返回true,则a instanceof B一定返回true。
则B是A的父类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值