首页 > 编程语言 >Java对象是如何创建出来的?

Java对象是如何创建出来的?

时间:2024-04-09 21:57:11浏览次数:18  
标签:初始化 Java 对象 创建 JVM 零值 加载

创建一个Java对象还不简单?new一下就出来了:
Object obj = new Object();
不过,我相信,读者既然进来阅读这篇文章,想必是不满足于仅仅掌握创建Java对象的基本语法,而是要知其然也要知其所以然。下面,让我们一起来看看,对象是怎么创建出来的:

 

1、JVM进行类加载检查

当Java虚拟机(JVM)执行new指令时,首先会检查类是否已被加载、解析和初始化过。如果没有,则通过JVM类加载子系统进行加载。

2、为新生对象分配内存

当类加载检查通过之后,JVM会根据已加载的类信息在Java堆中划分一块确定大小的内存给新生对象。JVM给对象分配内存是一项复杂的任务,我会在《JVM内存分配机制》当中做详细讲解。

3、将分配的内存空间初始化为不包括对象头的零值

内存分配完成后,JVM需要将分配到的内存空间都初始化为零值(不包括对象头), 如果使用TLAB,这一工作过程也可以提前至TLAB分配时进行。这一步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。

4、为新生对象设置对象头

初始化零值之后,JVM要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄、对象的锁状态等信息,这些信息就是包含在所谓的对象头中,对象头是存储在对象内存布局中的一部分。在Java中,开发人员无法直接设置对象头,因为对象头是由Java虚拟机自动管理的。对象头的设置和管理是由Java虚拟机在对象创建和销毁时自动处理的。

5、 执行<init>方法

执行<init>方法,即对象按照程序员的意愿进行初始化。对应到语言层面上讲,就是为属性赋值(注意,这与上面的赋零值不同,这是由程序员赋的值),和执行构造方法。

标签:初始化,Java,对象,创建,JVM,零值,加载
From: https://www.cnblogs.com/springmorning/p/18124923

相关文章

  • java中的远程调用http
    分享一下项目中用过的远程调用方法并总结两种请求方式的差别http远程调用一般分为两种get和post(其它方式暂不考虑)pom包<!--http远程调用--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifa......
  • 03-JAVA设计模式-适配器模式
    适配器模式设么是适配器模式它属于结构型模式,主要用于将一个类的接口转换成客户端所期望的另一种接口,从而使得原本由于接口不兼容而无法协同工作的类能够一起工作。适配器模式主要解决的是不兼容接口的问题。在软件开发中,经常会有这样的情况:我们有一个现有的类,它的接口(方......
  • 基于JAVA Springboot + Vue 前端后分离 实现【考研资讯平台】(内附设计LW + PPT+ 源码
    项目名称项目名称:考研资讯平台项目技术栈该项目采用了以下核心技术栈:后端框架/库:SpringBoot数据库:MySQL前端技术:Vue.js(前后端分离)项目展示5.1学生前台功能模块5.1.2首页在系统首页可以查看以下内容:首页考研资讯报考指南资料信息论坛信息我的跳转到后台购物......
  • 基于JAVA Springboot + Vue 前端后分离 实现【教师人事档案管理系统】(内附设计LW + PP
    项目名称项目名称:教师人事档案管理系统项目技术栈该项目采用了以下核心技术栈:后端框架/库:Java数据库:MySQL前端技术:Vue.js(前后端分离)开发工具:Eclipse项目展示5.1前台功能模块前台首页在教师人事档案管理系统首页可以查看以下内容:首页培训信息系统公告个人中心......
  • 《架构风清扬-Java面试系列第19讲》解释一下Java中的“volatile”在多线程环境中的作
    适用范围:这道题适应范围挺宽的,各个年限都可以用参考答案:主要用于确保变量在多个线程之间的可见性和有序性。可见性:当一个线程修改了被volatile修饰的变量,其他线程能够立即看到修改后的值。这确保了变量在多个线程之间的可见性。有序性:volatile关键字能够防止指令重排序......
  • 最长公共子序列(线性dp)-java
    本文主要来描述两个字符串的最长公共子序列问题文章目录前言一、最长公共子序列二、算法思路1.dp[i][j]的四种情况2.dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]的关系3.dp数组的状态转移方程 4.dp数组具体如下三、代码如下1.代码如下(示例):2.读入数据3.代码运行结......
  • Java基础知识-面向对象编程(OOP)-Java集合框架-多线程和并发-Spring框架
    Java基础知识:Java的四种基本数据类型是:byte、short、int、long(整数类型)、float、double(浮点类型)、char(字符类型)、boolean(布尔类型)。它们之间的区别主要在于占用的内存大小和表示范围不同。Java中的String是不可变的意味着一旦String对象被创建,它的值就不能被修改。这意味着St......
  • Java IO与NIO-Java内存管理-Java虚拟机(JVM)-Java网络编程-Java注解(Annotation)
    JavaIO与NIO:请解释Java中的IO(Input/Output)和NIO(NewInput/Output)的区别是什么?它们各自的优势是什么?答案:Java中的IO是基于流(Stream)的方式进行输入输出操作,而NIO则是基于通道(Channel)和缓冲区(Buffer)的方式进行输入输出操作。NIO相比于IO具有非阻塞IO、选择器(Selector)和内存映......
  • # C++之STL整理(7)之queue用法(创建、赋值、增删查改)详解
    C++之STL整理(7)之queue用法(创建、赋值、增删查改)详解注:整理一些突然学到的C++知识,随时mark一下例如:忘记的关键字用法,新关键字,新数据结构C++的queue用法整理C++之STL整理(7)之queue用法(创建、赋值、增删查改)详解queue1.queue构造函数2.queue存取、插入和删除操作3.......
  • Java——继承(含习题)
    继承的概念定义面向对象的继承,指在由一般类和特殊类形成的“一般-特殊”之间的类结构中,把一般类和所有特殊类都共同具有的属性和操作一次性地在一般类中进行定义,特殊类不再重复定义一般类已经定义的属性和操作,特殊类自动拥有一般类(以及所有更上层的一般类)定义的属性和操作......