Java对象的前世今生
文章目录
- 一、创建对象的步骤
- 二、类加载机制
- 三、内存分配
- 指针碰撞 (内存连续)
- 空闲列表 (内存不连续)
- 四、创建对象的5种方法
- 五、浅拷贝与深拷贝
以下一行代码内部发生了什么?
Person person = new Person();
一、创建对象的步骤
根据JLS中的规定,Java对象的创建过程可以简要地描述为以下几个步骤:类加载、分配内存、初始化、调用构造方法、返回对象应用

- 类加载:包括查找并加载类的字节码
.class文件,并将其转换成可执行代码,使得JVM可以执行这些类。 - 分配内存:当使用new关键字创建一个对象时,Java虚拟机会在堆内存中分配一块
连续的内存空间来存储对象的实例变量和引用类型。 - 初始化:分配内存后,Java虚拟机对新创建的对象进行初始化。这包括对对象的实例变量进行默认初始化(数值类型为0,引用类型为null),并调用相应的构造方法来完成对象的初始化过程。如果对象存在
继承关系,会从父类到子类依次调用构造方法,确保所有父类的构造方法都得到执行。 - 调用构造方法:构造方法是特殊的方法,用于初始化对象的状态。在对象初始化的过程中JVM会调用与类对应的构造方法来完成实例变量的初始化以及其他必要的初始化操作。
- 返回对象引用:对象初始化完成后
new表达式会返回对新创建对象的引用,使得程序可以通过该引用访问和操作对象。
二、类加载机制
JVM提供了三个类加载器,分别是BootStrap > Extension > Application,也可以自定义。
为了保证安全性和避免重复加载,设计了双亲委派机制。
即按照类加载器的层级关系逐层进行委派。如果父加载器无法加载,自己再尝试加载。如果已经加载过,自己就不用再重复加载。
只要是符合 JVM 规范的字节码,不管通过 Java 源码编译生成的还是使用Java 字节码操纵工具类库(ASM、Javassist、cglib)生成的,都可以交给类加载器去加载。
三、内存分配
JVM在运行Java程序时,需要管理内存的分配和回收。在内存管理的过程中,有两种常见的方式:指针碰撞(Bump the Pointer)和空闲列表(Free List)。JVM根据堆的不同区域和不同用途,选择不同的分配方式,具体的实现取决于不同的JVM实现和垃圾收集器策略。
指针碰撞 (内存连续)
常用于实现固定大小的内存分配。JVM维护一个指向空闲内存区域的指针(称为"指针碰撞指针"),并且假定堆中的内存是连续的,分配内存就是将指针往前移动一定的字节数,然后将移动后的位置返回给请求分配内存的程序。
该方式是以堆的内存是连续(内存规整)的作为前提条件的,这就要求Java虚拟机在启动时就要知道堆的大小,这样才能在堆的起始地址设置指针碰撞指针。因此,该方式不适用于动态扩展堆内存的情况。
空闲列表 (内存不连续)
适用于动态扩展堆内存的情况。JVM维护一个空闲内存块列表,记录哪些内存块是可用的,而分配内存时,会遍历空闲列表,找到合适大小的内存块,并将其标记为已分配。这样,内存的分配可以更加灵活,不需要连续的内存空间。
缺点是会产生一定的内存碎片。该问题JVM采用了内存整理算法来解决,如压缩、分代回收等。
四、创建对象的5种方法
- 使用
new关键字:可以调用类的构造方法来创建对象,并在堆内存中为对象分配空间。
Person person = new Person();
- 使用
反射:通过Class类的newInstance()方法或者Constructor类的newInstance()方法可以创建对象。
Class<?> personClass = Class.forName("com.example.Person");
Person person= (Person) personClass.newInstance();
- 使用
clone()方法:可以实现对象的浅拷贝或者深拷贝。
Person person = new Person();
Person clonedPerson= (Person) person.clone();
- 使用
对象工厂:对象工厂用于封装对象的创建过程,可以根据需要返回不同类型的对象实例。
public class PersonFactory {public static Person createPerson() {return new Person();}
}Person person = PersonFactory.createPerson();
- 使用
静态工厂方法:类中的静态方法可以作为工厂方法,用于创建对象实例。静态工厂方法通常有自定义的名称,便于描述对象的创建方式。
public class Person{private Person() { }public static Person createPerson() {return new Person();}
}
Person person = Person.createPerson();
五、浅拷贝与深拷贝
浅拷贝(Shallow Copy)
浅拷贝是复制对象本身和对象中的基本数据类型的字段,但不会复制对象中的引用类型字段。
在浅拷贝中,被复制对象和新创建的对象会共享引用类型字段,这意味着如果改变了一个对象中的引用类型字段,那么另一个对象中的对应字段也会受到影响。
class Person {private String name;private Address address;
}Person originalPerson = new Person("Patrick", new Address("BJ"));
Person copiedPerson = (Person) originalPerson.clone();
originalPerson对象和copiedPerson对象是两个独立的对象,但是它们共享同一个Address对象,如果修改了copiedPerson对象的Address对象,那么originalPerson对象的Address对象也会随之改变。
浅拷贝常用的API有Spring的BeanUtils、Apache commons包中的PropertyUtils、实现Cloneable接口、Arrays的copyOf()方法
深拷贝(Deep Copy)
深拷贝是复制对象本身和对象中的所有字段,包括引用类型字段。不是复制该对象的地址,而是递归复制该对象所有引用类型成员的副本。即被复制对象和新创建的对象完全独立,它们拥有各自的引用类型字段的副本,因此修改一个对象的引用类型字段不会影响另一个对象。
class Person {private String name;private Address address;public Person deepCopy() {Person newPerson = new Person(this.name, this.address.deepCopy());return newPerson;}
}class Address {private String city;public Address deepCopy() {return new Address(this.city);}
}Person originalPerson = new Person("Patrick", new Address("BJ"));
Person copiedPerson = originalPerson.deepCopy();
deepCopy()方法分别在Person和Address类中实现了深拷贝。
深拷贝常用的5个API
- 重写clone方法,每个对象都要实现Cloneable接口并重写Object类中的clone方法
- 序列化时必须实现Serializable接口
- Apache commons工具包SerializationUtils.clone(T object)
- 通过JSON工具类实现深拷贝
- 通过手动
new对象实现构造器方法的深拷贝
动态代理,本质上就是在特定的时机,去修改已有类型实现,或者创建新的类型。
相关文章:
Java对象的前世今生
文章目录 一、创建对象的步骤二、类加载机制三、内存分配指针碰撞 (内存连续)空闲列表 (内存不连续) 四、创建对象的5种方法五、浅拷贝与深拷贝 以下一行代码内部发生了什么? Person person new Person();一、创建对象的步骤 根据JLS中的规定,Java对象…...
Qt中JSON的使用
一.前言: JSON是一种轻量级数据交换格式,常用于客户端和服务端的数据交互,不依赖于编程语言,在很多编程语言中都可以使用JSON,比如C,C,Java,Android,Qt。除了JSON&#x…...
linux安装Tomcat部署jpress教程
yum在线安装: 查看tomcat相关的安装包: [rootRHCE ~]# yum list | grep -i tomcat tomcat.noarch 7.0.76-16.el7_9 updates tomcat-el-2.2-api.noarch 7.0.76-16.el7_9 updat…...
高并发负载均衡---LVS
目录 前言 一:负载均衡概述 二:为啥负载均衡服务器这么快呢? 编辑 2.1 七层应用程序慢的原因 2.2 四层负载均衡器LVS快的原因 三:LVS负载均衡器的三种模式 3.1 NAT模式 3.1.1 什么是NAT模式 3.1.2 NAT模式实现LVS的缺点…...
微前端中的 CSS
本文为翻译 本文译者为 360 奇舞团前端开发工程师原文标题:CSS in Micro Frontends 原文作者:Florian Rappl 原文地址:https://dev.to/florianrappl/css-in-micro-frontends-4jai 我被问得最多的问题之一是如何在微前端中处理 CSS。毕竟&…...
在CSDN学Golang场景化解决方案(分布式日志系统)
一,传统 elk 解决方案及其弊端 传统ELK(Elasticsearch Logstash Kibana)方案是一种流行的分布式日志系统解决方案,但也存在一些弊端: 依赖性:ELK使用Java编写,需要安装JVM,并且还…...
电脑第一次使用屏幕键盘
操作流程 1.在键盘上同时按WinR打开运行; 2.输入control 3.找到设置中心 4.点击屏幕键盘 效果 具体怎么使用 我不咋清除 简单 测试了一下 可以用鼠标点击屏幕键盘的按键 用键盘 按字母键和数字键 是和屏幕键盘不同步的 其他 tab、shift、后退、enter好像同步...
【C#学习笔记】类型转换
文章目录 类型转换字符转数字GetNumericValueConvert.ToInt32隐式转换计算 字符串转数字Parse 或 TryParse 方法 字节数组转整数 as,is强制类型转换isas 用户定义的转换 类型转换 我们简单地将值类型分为5种:整数型,浮点型,布尔型…...
SpringBoot+SSM实战<一>:打造高效便捷的企业级Java外卖订购系统
文章目录 项目简介项目架构功能模块管理端用户端 技术选型用户层网关层应用层数据层工具 项目优缺点结语 黑马程序员最新Java项目实战《苍穹外卖》:让你轻松掌握SpringBootSSM的企业级开发技巧项目简介 《苍穹外卖》是一款为餐饮企业(餐厅、饭店&#x…...
笙默考试管理系统-MyExamTest--calculagraph
笙默考试管理系统-MyExamTest--calculagra(1) 目录 一、 笙默考试管理系统-MyExamTest--calculagra 二、 笙默考试管理系统-MyExamTest--calculagra 三、 笙默考试管理系统-MyExamTest--calculagra 四、 笙默考试管理系统-MyExamTest--calculagra …...
Mysql面试突击班索引,事务与锁
Mysql面试突击班索引,事务与锁 1.为什么Mysql要使用B树做为索引而不用B树 B树能显著减少IO次数,提高效率B树的查询效率更加稳定,因为数据放在叶子节点B树能提高范围查询的效率,因为叶子节点指向下一个叶子节点B树采取顺序读 2.…...
数据结构——AVL树
文章目录 一.AVL树的定义二.AVL树的插入三.插入后更新平衡因子四.AVL树的旋转1.左单旋2.右单旋3.先左单旋再右单旋4.先右单旋再左单旋 五.AVL树的性能分析六.检查是否满足AVL树七.源码 一.AVL树的定义 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉…...
AI写作宝有哪些,分享两种AI写作工具
AI写作宝是一种基于人工智能技术的写作辅助工具。它可以根据用户输入的关键词和主题快速生成文章。AI写作宝可以为用户节省大量的时间和精力,帮助用户快速生成高质量的文章。今天就为大家推荐两款AI写作宝: 一、AI创作家 AI创作家是一款基于人工智能技…...
【uniapp 控制页面滑动速度】
可以使用 uni-app 提供的 onTouchMove 事件来控制页面滑动速度。 可以在 onTouchMove 事件方法中使用 event.deltaY 计算页面滑动的速度,然后根据需要来调整速度值,最后通过 event.preventDefault() 阻止默认的滑动行为,从而实现控制页面滑动…...
7-24 整数的分类处理 (20 分)
7-24 整数的分类处理 (20 分) 给定 N 个正整数,要求你从中得到下列三种计算结果: A1 能被 3 整除的最大整数 A2 存在整数 K 使之可以表示为 3K1 的整数的个数 A3 存在整数 K 使之可以表示为 3K2 的所有整数的平均值(精确到小数…...
MYSQL事务同时修改单条记录
疑问:Mysql多事务默认情况下,同时修改同一条记录运行修改吗?是否要手动加上for update行锁。 猜想:MySQL 会自动对涉及的数据行加上写锁(排他锁),以确保数据的一致性和隔离性。这是在默认的事务…...
安装skywalking并集成到微服务项目
文章目录 一、前言二、介绍1. 架构 三、安装skywalking服务端四、启动skywalking服务端五、微服务项目开发注册中心网关服务商品服务订单服务支付服务测试 六、下载java客户端七、微服务集成skywalking客户端1. idea启动2. 命令行启动3. 集成效果4. 服务实例5. 修改服务实例名称…...
一支笔,一双手,一道力扣(Leetcode)做一宿
文章目录 一、分享自己相关的经历二、分析可能存在的问题三、根据问题进行分解或建立思维导图四、分享好用的刷题网站并进行介绍 一、分享自己相关的经历 我是一名计算机专业的学生,之前在学习算法和数据结构时,对于简单题目还算能够顺利地刷过去。但是…...
Kubernetes(K8s)从入门到精通系列之九:使用kubeadm工具快速安装K8s集群
Kubernetes K8s从入门到精通系列之九:使用kubeadm工具快速安装K8s集群 一、安装kubeadm二、修改kubeadm的默认配置三、下载K8s相关镜像四、运行kubeadm imit命令安装Master节点五、将新的Node加入集群六、安装CNI网络插件七、验证K8s集群是否工作正常八、搭建高可用K8s集群详细…...
RabbitMQ 教程 | 第11章 RabbitMQ 扩展
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…...
Unity3d之随机生成数字
UnityEngine.Random.Range(min,max)包含最小值不包含最大值Mathf.Clamp是限定范围...
科研抢发期必看:Perplexity图书推荐查询速效组合技——3分钟生成带引用格式的跨学科书单
更多请点击: https://codechina.net 第一章:科研抢发期必看:Perplexity图书推荐查询速效组合技——3分钟生成带引用格式的跨学科书单 在论文投稿前的关键窗口期,快速定位权威参考文献是提升学术严谨性与跨学科说服力的核心能力。…...
告别GDB依赖:在NEMU里打造专属调试器,我是如何搞定单步执行与内存扫描的
从零构建教学级调试器:NEMU Monitor模块深度解析与实践指南 在计算机系统与体系结构的学习过程中,调试器如同探索程序执行奥秘的显微镜。传统调试工具如GDB虽然功能强大,但其内部工作机制对初学者而言却如同黑箱。本文将带您深入NEMU模拟器的…...
在微服务架构中利用 Taotoken 实现多模型 API 的动态切换与调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在微服务架构中利用 Taotoken 实现多模型 API 的动态切换与调用 面向后端架构师或开发负责人,当微服务系统需要集成多种…...
Keil MDK中EVR选项缺失的解决方案与原理
1. 问题现象解析:EVR选项缺失的典型表现 在Keil MDK开发环境中使用Event Recorder(事件记录器)时,开发者常会遇到一个令人困惑的现象:按照官方文档配置printf重定向到EVR时,STDOUT的下拉菜单中本该出现的&q…...
从COCO到Cityscapes:实例分割指标mAP和mIOU在不同数据集上的表现差异与陷阱
从COCO到Cityscapes:实例分割指标mAP和mIOU在不同数据集上的表现差异与陷阱 当你在COCO数据集上训练的Mask R-CNN模型取得了0.85的mAP,满怀信心地将其部署到自动驾驶项目的Cityscapes数据集上时,却发现mIOU从预期的0.75骤降到0.52——这种&qu…...
我的第一个CANOpen主站:手把手教你用CanFestival-3源码配置心跳、SYNC和PDO映射
我的第一个CANOpen主站:手把手教你用CanFestival-3源码配置心跳、SYNC和PDO映射 当你第一次面对工业现场总线协议时,那种既兴奋又忐忑的心情我至今记忆犹新。CANOpen作为工业自动化领域的"普通话",其主站开发往往是工程师进阶路上的…...
技术从业者的时间管理:如何平衡工作、学习和生活
在敏捷开发大行其道、技术迭代日新月异的当下,软件测试从业者正面临着前所未有的时间压力。一边是项目交付的紧迫期限、层出不穷的缺陷排查需求,一边是自动化测试工具、AI测试框架等新技术的学习焦虑,再加上对个人生活品质的追求,…...
初次使用 Taotoken 控制台的快速浏览与核心功能导引
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初次使用 Taotoken 控制台的快速浏览与核心功能导引 当你注册并登录 Taotoken 平台后,首先进入的就是用户控制台。这个…...
ClaudeCodeOpenAI Token免费使用
2000万claude ops4.7 以及openai gpt5.5 token免费使用apikey贴在这里了:ops4.7sk-119f6d1b81af70e6018f5cf6eb6309261857c98a22280f27345a073c12560e2fgpt5.5sk-b013d9140497d3c7af94459a41f189e4013994f1fe8bac3d5a839e4bcf4413a9使用指南和文档在apikeyfun.com...
