对象实例化过程

目录

一、Java对象实例化在JVM中的过程:

类加载与初始化

分配内存

初始化对象内存

设置对象头

执行初始化方法

构造方法执行

二、对象的创建过程


一、Java对象实例化在JVM中的过程:

类加载与初始化
  • 当JVM需要实例化一个对象时,它首先会检查目标类是否已经被加载和初始化。
  • 如果类没有被加载,JVM会通过类加载器(ClassLoader)将类的字节码文件加载到内存中,并为其生成对应的Class对象。
  • 加载完成后,JVM会进行类的初始化,这包括执行类中的静态变量初始化、静态代码块等。
分配内存
  • 一旦类完成初始化,JVM会根据目标类的大小在堆内存中为其分配内存空间。
  • 内存分配的方式取决于Java堆内存的规整性,可能采用指针碰撞或空闲列表。
初始化对象内存
  • 为对象分配内存后,JVM会将对象的普通成员变量(实例变量)初始化为默认值(如int为0,String为null)。
  • 这一步确保对象在构造方法执行前,其字段已经是确定的默认值,可以安全地被访问。
设置对象头
  • JVM还会为新创建的对象设置对象头信息,包括对象的哈希码、GC分代年龄、锁状态等,以及对象的类元信息(指向Class对象的指针)。
执行初始化方法
  • 对于Java程序来说,对象的创建在JVM层面完成后,还需要执行Java代码层面的初始化。
  • 这包括执行由编译器自动生成的<init>方法(也称为实例构造器或构造器方法),该方法会初始化成员变量的值,执行实例初始化块(非静态代码块),并最终调用目标对象的构造方法。
构造方法执行
  • 构造方法是Java程序员在类中定义的,用于初始化对象的特殊方法。
  • 当构造方法执行完毕后,一个完全初始化的Java对象就创建完成了。

二、对象的创建过程

1、实例化一个对象,jvm首先会检查目标对象是否被加载并**初始化,**如果没有需要立刻去加载目标类,然后调用目标类的构造器完成初始化。

2、目标的加载通过类加载器来实现,主要是把一个类加载到内存中

3、然后是初始化的过程,主要是对目标类里面的静态变量、成员变量、静态代码块进行初始化,

4、当目标类被初始化以后,就可以从常量池里面去找到对应的类元信息了,并且目标对象的大小在类加载完之后就确定了,所以就需要为新创建的对象根据目标对象的大小在堆内存里面去分配内存空间,内存分配的方式2种,1、指针碰撞,2、空闲列表。

5、jvm会根据java堆内存是否规整来决定内存的分配方法,然后jvm会把普通成员变量初始化为0值,int-->0,string--> null。 主要是为了保证对象里面的实例字段不用初始化就可以直接使用,也就是程序能够直接获取这些字段,对应的数据类型的0值,

6、然后还需要对目标对象的对象头做一些设置,比如对象所属的类元信息 。 对于jvm来说 新对象的创建工作完成了,但是对于java语言来说,对象创建刚刚开始,接下来要做的就是执行目标对象内部生成的init方法,初始化成员变量的值,执行构造块、最后调用目标对象的构造方法,完成对象创建。init java文件编译后 在字节码文件里面生成的,他是一个实例构造器,会把变量初始化,完成初始化动作。

相关推荐
小江的记录本5 小时前
【网络安全】《网络安全与数据安全核心知识体系》(包括数据脱敏、数据加密、隐私合规、等保2.0)
java·网络·后端·python·算法·安全·web安全
北漂Zachary5 小时前
PHP vs Python vs Java:三大编程语言终极对比
java·python·php
Paxon Zhang5 小时前
JavaEE初阶学习web开发的第一步**计算机组成原理,操作系统,进程(基础扫盲)**
java·后端·学习·java-ee
慕容卡卡5 小时前
大模型核心,MCP(模型上下文协议)和Session API
java·开发语言·人工智能·spring boot·spring cloud
zore_c5 小时前
【C++】C++类和对象实现日期类项目——时间计算器!!!
java·c语言·数据库·c++·笔记·算法·排序算法
小郑加油5 小时前
python学习Day6-7天:条件判断与基本综合应用
java·服务器·apache
苏瞳儿10 小时前
java对数据库的增删改查
java·数据库·oracle
zhangjw3410 小时前
Java基础语法:变量、数据类型与运算符,从原理到实战
java·开发语言
yaoxin52112313 小时前
384. Java IO API - Java 文件复制工具:Copy 示例完整解析
java·开发语言·python
NotFound48614 小时前
实战指南如何实现Java Web 拦截机制:Filter 与 Interceptor 深度分享
java·开发语言·前端