Java面向对象在JVM里怎么实现

这个问题,可以从User user = new User();里的new开始理解。

Java 复制代码
User user = new User();

我们每天都在写类似上面的代码,但估计没多少人去想:JVM到底做了什么,这个对象才真正诞生?

new只是我们写出来的「语法」,真正把对象创建出来的是JVM。实际的步骤还蛮多的:

  • JVM先找到User对应的类型,然后根据类型信息确定对象需要多大的内存,申请一块空间;
  • 接着把类型指针写进对象头,字段区域按需要初始化。

到这里,一个真正的Java对象才算创建完成。

对象已经创建出来了,但新的问题也来了。它怎么知道自己属于哪个类型?

因为堆里的实例只管存数据,比如name、age这类字段。对象头里有一个类型指针,指向User的类型信息。对象本身并不知道有哪些方法,它只知道自己属于哪个类型。

真正管「我是谁、字段怎么排、有哪些方法」的,是类型。

但是依然还是有问题,光知道自己属于哪个类型还不够。当我们写:

Java 复制代码
user.save();

JVM又是怎么知道去执行哪个save()的?

方法信息不在对象里,在类型里。JVM内部有一个专门描述类型的数据结构,叫Klass。

类型里保存着这个类的所有类型信息,比如方法、字段布局、父类等。JVM不会去对象里找方法,而是先根据对象头里的类型指针找到类型,再从类型里找到save()对应的方法。getClass()走的也是对象到类型这条路,最后才变成Java里的Class对象。

那为什么不把方法直接放到对象里呢?因为同一个类可能会创建N多个对象。如果每个对象都保存一份方法,内存浪费就太大了。

所以才把方法统一放到类型里,每个对象只保存一个类型指针。同一类创建再多实例,也共享同一份类型和方法信息,对象本身可以保持得很轻量。

你可能会觉得,为啥没讲继承,多态之类的,这些是Java 提供了哪些面向对象的语言特性,而不是面对对象怎么实现。

相关推荐
guo_wen_qiang3 分钟前
云服务器nacos搭建-集群&持久化
java·运维·服务器
明月_清风6 分钟前
AI Agent 进入系统层:现在有哪些开源项目在解决这个问题?
人工智能·后端
弈栈录34 分钟前
MySQL 事务、索引与锁:后端开发必须掌握的数据库基础
数据库·后端
江江爱编程34 分钟前
java零基础保姆级教学01
java·开发语言
明月_清风35 分钟前
AI Agent 最大的问题,可能不是智商,而是“权限”
人工智能·后端
96245635 分钟前
餐饮 SaaS 优惠券系统架构演进(三):优惠计算引擎——商品级计价、冲突策略与优惠分摊
java·数据库·spring boot
vx_Biye_Design38 分钟前
expressDeepSeek社团咨询助手的学生社团管理系统60746-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·课程设计·express
长安米粒贵39 分钟前
缓存明明加了,为什么数据还是不一致?聊聊 4 个容易忽略的边界
后端
yunwei3742 分钟前
eBPF 开发实践:使用 eBPF 隐藏进程或文件信息
linux·后端·性能优化
高频因子挖掘机44 分钟前
行情监控脚本重启后,怎样快速恢复而不重复拉取数据?
后端·github·api