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

简介: 哈喽,我是子牙。十余年技术生涯,一路披荆斩棘从技术小白到技术总监到JVM专家到创业。技术栈如汇编、C语言、C++、Windows内核、Linux内核。特别喜欢研究虚拟机底层实现,对JVM有深入研究。分享的文章偏硬核,很硬的那种。

哈喽,我是子牙。十余年技术生涯,一路披荆斩棘从技术小白到技术总监到JVM专家到创业。技术栈如汇编、C语言、C++、Windows内核、Linux内核。特别喜欢研究虚拟机底层实现,对JVM有深入研究。分享的文章偏硬核,很硬的那种。

手撸过JVM、内存池、垃圾回收算法、synchronized、线程池、NIO、三色标记算法…

erafbbd8u7.png

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

上篇文章我给出的结论是:下面这段创建对象的代码,在JVM中只会创建一个对象,并给出了强有力的证明。并且说到,父类的属性也是存储在子类对象中的,同样也给出了铁证。

image.png

但是今天在手撸JVM的过程中,我又陷入了深深的思考:父类中公共属性存储到子类对象上我能理解,父类中的私有属性为什么也要这么干呢?于是开启了一连串的风骚操作,最终找到了答案。为了方便大家拿去考核人才,我把它提炼成了又一道面试题:通过子类对象能访问父类对象的私有属性吗?如果不能,为什么要把父类的私有属性存储到子类对象上?

探索访问父类私有属性

image.png

直接访问的方式肯定是不行的,这个应该没争议吧!额,你有?建议把Java基础拿起来再看一遍。这时候我在想,如果Idea等开发工具如果不报错,会不会真的有小伙伴这样写,然后反手就run。哈,开玩笑的,最菜的肯定是我咯。

大家平时写代码的普遍做法都是定义get、set方法去访问私有属性,没毛病。

如果我问:通过反射能不能访问到?是不是有小伙伴陷入了思考:能?不能?么事,敲代码验证。

image.png
image.png

是访问不到的。方法getDeclaredField只能获取当前类的所有成员属性,不论是private、protect、public还是static的。

我发现

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

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

image.png

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

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

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

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

image.png
image.png

我是子牙老师,喜欢钻研底层,深入研究Windows、Linux内核、JVM。如果你也喜欢研究底层,欢迎关注我的公众号【硬核子牙】

相关文章
|
6天前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
1月前
|
安全 Java 应用服务中间件
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
什么是类加载器,类加载器有哪些;什么是双亲委派模型,JVM为什么采用双亲委派机制,打破双亲委派机制;类装载的执行过程
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
|
8天前
|
Java 应用服务中间件 程序员
JVM知识体系学习八:OOM的案例(承接上篇博文,可以作为面试中的案例)
这篇文章通过多个案例深入探讨了Java虚拟机(JVM)中的内存溢出问题,涵盖了堆内存、方法区、直接内存和栈内存溢出的原因、诊断方法和解决方案,并讨论了不同JDK版本垃圾回收器的变化。
17 4
|
11天前
|
Java API 对象存储
JVM进阶调优系列(2)字节面试:JVM内存区域怎么划分,分别有什么用?
本文详细解析了JVM类加载过程的关键步骤,包括加载验证、准备、解析和初始化等阶段,并介绍了元数据区、程序计数器、虚拟机栈、堆内存及本地方法栈的作用。通过本文,读者可以深入了解JVM的工作原理,理解类加载器的类型及其机制,并掌握类加载过程中各阶段的具体操作。
|
11天前
|
存储 缓存 JavaScript
JVM面试真题总结(一)
JVM面试真题总结(一)
|
6天前
|
存储 Kubernetes 架构师
阿里面试:JVM 锁内存 是怎么变化的? JVM 锁的膨胀过程 ?
尼恩,一位经验丰富的40岁老架构师,通过其读者交流群分享了一系列关于JVM锁的深度解析,包括偏向锁、轻量级锁、自旋锁和重量级锁的概念、内存结构变化及锁膨胀流程。这些内容不仅帮助群内的小伙伴们顺利通过了多家一线互联网企业的面试,还整理成了《尼恩Java面试宝典》等技术资料,助力更多开发者提升技术水平,实现职业逆袭。尼恩强调,掌握这些核心知识点不仅能提高面试成功率,还能在实际工作中更好地应对高并发场景下的性能优化问题。
|
2月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
3月前
|
Java 编译器 程序员
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
|
3月前
|
存储 Java 程序员
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
63 10
|
3月前
|
存储 运维 Java
Java面试题:JVM的内存结构有哪些主要部分?请简述每个部分的作用
Java面试题:JVM的内存结构有哪些主要部分?请简述每个部分的作用
52 9