关于Java继承中子类对象赋值给父类对象之后类型问题以及getClass()方法返回值的问题

前言

今天在复习Java的时候无意间用到了getClass方法,不过发现了一点以前没有发现过的问题,在这里记录一下。

问题描述

我写了两个类一个叫做Per另一个叫做Stu
在这里插入图片描述在这里插入图片描述
Stu类继承了Per类,然后我实例化了两个类的对象,接着我将子类的stu对象赋给父类的per对象
在这里插入图片描述
随后我使用hashCode()方法打印出了per对象刚刚生成的时候以及被赋值给stu对象之后的内存地址,发现两个内存地址是不相同的,这就说明per这个引用已经不再指向原来的那个对象的地址空间,而是指向了新的对象地址空间,其实指向的就是stu对象的地址空间。

不过这里有一个问题是:既然per指向了stu对象的地址空间那per应该是Stu类型的,并且可以调用Stu类中的方法。但是我做了一下测试发现不可以
在这里插入图片描述
可是这个时候发生一个很有意思的事情,当我用编译器查看per对象的类型时候,编译器给出的是
在这里插入图片描述
可能这也就是为什么per不能调用Stu类中的方法的原因。
这个时候编译器依然认为per是Per类型的,当我使用per的getClass()方法时候,输出结果如下
在这里插入图片描述
我们可以看出输出类名是Stu的。

解析

当看到这个的时候我百思不得其解,编译器认为per是Per类型的,而获得到的class名字却是Stu,于是我尝试着去看了一下源码:
在这里插入图片描述
我把官方给的例子运行了一下,发现getClass()的运行机制的确如此
在这里插入图片描述
从这里我们看出n打印出来的class是Integer,可以知道的是Integer是继承Number的。这样一来就和我上面自己描述的情况完全一致。在Number n = 0;这条语句执行之后n相当于被隐式的转换成了Number的子类Integer类型的。

总结

虽然Java的官方案例证明了这一点是合理的,不过我还是没有去研究它的底层机制到底是为什么,另外还有一个问题就是为什么父类对象被被子类对象赋值之后类型依然是父类类型的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值