前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >贡献一道超高套路JVM面试题

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

原创
作者头像
子牙老师
修改2022-05-06 16:13:12
2780
修改2022-05-06 16:13:12
举报
文章被收录于专栏:手写JVM专栏

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

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

最近在手撸JVM实现OOP的封装机制的时候,有个问题引起了我的眉头紧锁。代码如下

代码语言:javascript
复制
public class Test_2 {
    public static void main(String[] args) {
        Test_2 obj = new Test_2();
    }
}

于是我把这个让我眉头紧锁的问题提炼成了一个面试题:这段创建对象的代码,在JVM内部创建了几个对象?

正方

两个:一个是Test_2对象,一个是Object对象。

会创建Test_2对象就不用说了。为什么会创建Object对象呢?因为Java中所有的类都继承自Object类,所有对象的创建都会调用类的构造方法,而这些构造方法中都会调用Object的构造方法。如图

图说明:这个图是Test_2的构造方法对应的字节码指令。有小伙伴不了解字节码的建议补一补,这玩意很重要。JVM的黑科技玩的就是这个!

逻辑紧凑,毫无破绽,有木有?多少小伙伴也是这样认为的留言区举个爪。

如何证明创建了两个对象?不知道!

反方

一个:只会创建Test_2对象。

那调用Object的构造函数干吗?反方内心开始慌乱~

如果Object类有属性,不创建Object对象,如何访问Object类中的属性?反方内心动摇:我支持正方观点。

代码语言:javascript
复制
public class Object {
    private String author = "ziya";
}

你跑来反方干什么?反奸!

正解

为什么我把创建两个对象定义为正方呢?呵,惭愧,我之前也是这样认为的。所以,答案是反方观点是正确的。那那两个问题怎么解释?呵,稳住,听我娓娓道来。

调用父类的构造函数,目的是什么?解释这个问题前,先说构造函数是干什么的:完成非静态属性的赋值。所以,调用父类的构造函数,目的是为了完成父类中的非静态属性的赋值。这是第一个问题。

接下来第二个问题:不创建父类对象如何访问父类的属性?其实这个问题的本质是:父类中的属性到底存储在哪?其实父类的属性是存储在子类对象上的,所以没必要创建父类对象!是不是有小伙伴不服气啦,没事,上图

你也可以通过HSDB查看JVM内存,结论是一样的

再多讲一个问题吧:父类的属性是如何存储到子类对象上的?因为调用父类对象是以子类对象身份调用的,所以父类构造函数中的非静态属性赋值语句,作用的都是子类对象。

如何证明?跟着我学习过JVM的小伙伴应该知道吧。借助Idea的调试功能。如图

为什么会出现两种不同的观点呢?我后面想了想:大部分小伙伴把调用构造函数等同于创建对象。其实从函数的本质来看:函数只是接受外面传参,执行相关逻辑,传出参数。构造函数本质上还是函数,并不具备创建对象的能力。

我有话说

答应我,如果你学会了,不要拿这道题去为难别人好吗?如果你实在忍不住,不要告诉别人是子牙老师那边学来的。我不想承担无谓的仇恨:NND,这是哪个抽风的面试官想到的面试题!同是程序猿,相煎何太急!

看到这篇文章的小伙伴,如果你在哪里面试遇到了这道面试题,请留言告诉我。我再发几个声讨!我与罪恶不同戴天!

题外话

子牙手写JVM小班四期正在招生。四期新增了字节码增强+Agent,学完你就可以做JVM相关的工作,如二开arthas,自研类hsdb调试器、自研实现热更新热部署零侵入日志等黑科技…

四期完整课程包含七大专题+一个增值专题,约50多个课时。完整学完你就可以:1、用Java写一个Java虚拟机,从而深入理解运行系统的底层细节;2、有能力自行研究Hotspot源码及其他用C语言、C++写的中间件源码;3、能够用C语言、C++写任何你感兴趣的基础算法如:内存池、垃圾回收算法、主从同步算法、执行引擎、存储引擎;4、就有底子跟着我学习下半年准备开的操作系统内核班……

这套课程,横跨多个计算机学科,但只是一个学科的价格。这套课程,JVM专家、功力深厚、经验丰富的子牙老师亲授,跟我学习不踩坑,全网唯一教授虚拟机的课程…

感兴趣小伙伴可以加班班微信咨询(jvm-anan),真诚招生,无任何套路。课程试看,问题真诚解答,全部了解清楚再上车。一二三期共500多VIP加入,无一人退费,好评不断

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正方
  • 反方
  • 正解
  • 我有话说
  • 题外话
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档