贡献一道超高套路JVM面试题(二)

本文探讨了在JVM中,为何父类的私有属性会被存储在子类对象中,即使无法直接通过子类访问。作者指出,虽然直接访问父类私有属性不可行,但通过反射也无法直接获取。这种设计旨在优化性能,避免在多层继承链中查找属性,并保持代码统一性。文章鼓励读者从设计者的角度思考问题,并通过实践深化理解。
摘要由CSDN通过智能技术生成

大家好,我是江湖人送外号[道格牙]的子牙老师。

本篇文章是接上篇文章【贡献一道超高套路JVM面试题】写的,如果你还没看过,墙裂都建议你看一下。

上篇文章我给出的结论是:下面这段创建对象的代码,在JVM中只会创建一个对象,并给出了强有力的证明。并且说到,父类的属性也是存储在子类对象中的,同样也给出了铁证。
在这里插入图片描述
但是今天在手撸JVM的过程中,我又陷入了深深的思考:父类中公共属性存储到子类对象上我能理解,父类中的私有属性为什么也要这么干呢?于是开启了一连串的风骚操作,最终找到了答案。为了方便大家拿去考核人才,我把它提炼成了又一道面试题:通过子类对象能访问父类对象的私有属性吗?如果不能,为什么要把父类的私有属性存储到子类对象上?

探索访问父类私有属性

直接访问的方式肯定是不行的,这个应该没争议吧!额,你有?建议把Java基础拿起来再看一遍。这时候我在想,如果Idea等开发工具如果不报错,会不会真的有小伙伴这样写,然后反手就run。哈,开玩笑的,最菜的肯定是我咯。
在这里插入图片描述
大家平时写代码的普遍做法都是定义get、set方法去访问私有属性,没毛病。

如果我问:通过反射能不能访问到?是不是有小伙伴陷入了思考:能?不能?么事,敲代码验证。
在这里插入图片描述
是访问不到的。方法getDeclaredField只能获取当前类的所有成员属性,不论是private、protect、public还是static的。

我发现

那为什么要这么做呢?说下我的两个理解。

1、如果不这样做,JVM OOP机制在实现的时候就需要创建父类对象,访问属性时就要加判断,如果是父类属性要沿着继承链往上找,如果继承链过长,就有性能问题了。如果继承链10层,就会多创建10个对象,找到属性极端要经过10次遍历。伪代码如下
在这里插入图片描述

2、如果不这样做,就不统一,程序就不好写了。就像你给前端写了个接口,比如要返回一个字段,你这边做了判断,如果为空就没有那个字段,这让前端就很奔溃了。一般前端取值都是默认有这个字段,她只判断是否为空。前端没脑子?前端妹子多呀!好看的妹子不带脑子怎么了?所以管理经验这东西,也不是看书就能学会的,也不是每个团队遵循的规范都得是一样的,得先了解这个团队,了解那几个常犯错的人的犯错习惯,制定特殊照顾规则。

有些东西,你只有从设计者的角度去思考,才能真正理解设计者。这也就是代码那么难懂的原因,因为你很难把自己真正摆在一个设计者的角度去思考问题,大多时候,你是阅读者。

对于底层,我的经验是:一个大的项目都是由无数小知识点组成的,那些个你很生疏的知识点,你自己试着去写一写,会有意想不到的收获。当你写得多了,你会发现,你学任何东西都比别人快,比别人理解得深。因为你能够触类旁通。

再给大家补个知识点点吧。大家用Idea、HSDB查看会发现,属性的位置是不一样的。其实正确的是HSDB,言外之意:在内存中,父类的属性是在子类属性前面的,因为是先调用父类的构造方法的属性赋值,再执行本类的构造方法完成本类中属性的赋值。
在这里插入图片描述
在这里插入图片描述

推荐阅读

1、内存编织技术,JVM对内存的又一次压榨
2、从hotspot源码层面剖析Java的多态实现原理
3、啊?i++与++i居然有这么多学问在里面
4、贡献一道超高套路JVM面试题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值