Java 大厂面试高频题:别再只会 new 了!Java 创建对象竟然有这么多种方式
在学习 Java 时我们最先接触的对象创建方式通常是PersonpersonnewPerson();因此很多初学者会认为 Java 创建对象只能使用new。实际上Java 中常见的对象创建方式不止一种。除了直接使用new还可以通过反射、克隆、反序列化、工厂方法等方式获得对象。本文将介绍 Java 中常见的 6 种对象创建方式1. 使用 new 关键字 2. 使用反射调用构造方法 3. 使用 Class.newInstance() 4. 使用 clone() 克隆对象 5. 使用反序列化创建对象 6. 使用工厂方法获得对象在理解这些方式之前需要先明确对象、引用变量和类不是同一个概念。一、什么是创建对象先定义一个简单的Person类classPerson{privateStringname;publicPerson(){System.out.println(Person 构造方法执行了);}publicPerson(Stringname){this.namename;System.out.println(有参构造方法执行了);}publicvoidsayHello(){System.out.println(你好我是name);}}创建对象时通常写PersonpersonnewPerson();这句代码可以拆成三部分Person变量的类型 person引用变量 new Person()创建 Person 对象真正创建出来的对象是newPerson()person只是一个引用变量它保存了对这个对象的引用。可以类比为Person 类房屋设计图 Person 对象根据设计图建出的房子 person 变量房子的门牌号接下来看看 Java 创建对象的不同方式。二、方式一使用 new 关键字使用new是最常见、最直接的对象创建方式。PersonpersonnewPerson();也可以调用有参构造方法PersonpersonnewPerson(张三);执行new Person(张三)时Java 大致会完成以下操作1. 在堆内存中为 Person 对象分配空间 2. 为成员变量设置默认值 3. 执行成员变量的显式初始化 4. 执行构造代码块 5. 调用对应的构造方法 6. 返回新对象的引用。使用publicclassTest{publicstaticvoidmain(String[]args){PersonpersonnewPerson(张三);person.sayHello();}}输出有参构造方法执行了 你好我是张三特点语法简单 可读性强 会调用构造方法 是日常开发中最常用的方式。大多数情况下创建普通业务对象都应该优先使用new。三、方式二使用反射调用构造方法反射允许程序在运行过程中动态获取类的信息并创建对象。推荐使用Constructor.newInstance()示例importjava.lang.reflect.Constructor;publicclassTest{publicstaticvoidmain(String[]args)throwsException{ClassPersonclazzPerson.class;ConstructorPersonconstructorclazz.getDeclaredConstructor(String.class);Personpersonconstructor.newInstance(李四);person.sayHello();}}输出有参构造方法执行了 你好我是李四代码解释如下。首先获取Person的Class对象ClassPersonclazzPerson.class;然后获取参数为String的构造方法ConstructorPersonconstructorclazz.getDeclaredConstructor(String.class);最后通过构造方法创建对象Personpersonconstructor.newInstance(李四);如果要调用无参构造方法可以写ConstructorPersonconstructorPerson.class.getDeclaredConstructor();Personpersonconstructor.newInstance();为什么需要反射创建对象因为有些场景在编写代码时并不知道最终要创建哪个类。例如配置文件中写着com.example.service.UserService程序运行时读取这个类名再动态创建对象。很多框架内部都大量使用了反射例如Spring Spring Boot MyBatis Hibernate JUnit JacksonSpring 扫描到一个带有Service注解的类后可以通过反射创建它的对象并交给 IoC 容器管理。特点可以动态决定创建哪个类 可以调用无参或有参构造方法 适合框架和底层工具开发 代码比 new 复杂 反射调用通常比直接 new 慢。在现代 Java 中通过反射创建对象时通常推荐使用Constructor.newInstance()。四、方式三使用 Class.newInstance()以前还可以通过Class对象的newInstance()方法创建对象PersonpersonPerson.class.newInstance();或者Class?clazzClass.forName(Person);Personperson(Person)clazz.newInstance();这段代码会调用Person的无参构造方法。但是这种方式存在明显限制只能调用无参构造方法 异常处理不够清晰 无法灵活选择构造方法 该方法已经被废弃。因此现在不建议继续使用clazz.newInstance();推荐改成PersonpersonPerson.class.getDeclaredConstructor().newInstance();也就是说Class.newInstance()可以作为面试知识点了解但新项目中应该使用Constructor.newInstance()。五、方式四使用 clone() 克隆对象clone()的作用不是从零开始创建一个全新状态的对象而是根据已有对象复制出一个新对象。首先让类实现Cloneable接口classPersonimplementsCloneable{privateStringname;publicPerson(Stringname){this.namename;System.out.println(构造方法执行了);}publicStringgetName(){returnname;}OverridepublicPersonclone()throwsCloneNotSupportedException{return(Person)super.clone();}}使用publicclassTest{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{Personp1newPerson(王五);Personp2p1.clone();System.out.println(p1p2);System.out.println(p2.getName());}}输出构造方法执行了 false 王五注意构造方法只执行了一次。执行Personp2p1.clone();时并不会再次调用Person的构造方法。同时p1p2结果为false说明p1和p2指向两个不同的对象。clone() 默认是浅拷贝如果Person中包含一个引用类型成员classAddress{Stringcity;}classPersonimplementsCloneable{Stringname;Addressaddress;OverridepublicPersonclone()throwsCloneNotSupportedException{return(Person)super.clone();}}执行Personp2p1.clone();会得到p1 和 p2 是不同的 Person 对象 p1.address 和 p2.address 指向同一个 Address 对象。也就是说super.clone()默认实现的是浅拷贝。如果需要深拷贝还需要继续复制内部对象。特点根据已有对象复制新对象 通常不会调用构造方法 默认是浅拷贝 需要实现 Cloneable 适合复制已有对象状态。六、方式五使用反序列化创建对象序列化是把对象转换成字节数据反序列化则是把字节数据恢复成对象。首先让类实现Serializableimportjava.io.Serializable;classPersonimplementsSerializable{privatestaticfinallongserialVersionUID1L;privateStringname;publicPerson(Stringname){this.namename;System.out.println(构造方法执行了);}publicStringgetName(){returnname;}}把对象序列化到文件importjava.io.FileOutputStream;importjava.io.ObjectOutputStream;PersonpersonnewPerson(赵六);try(ObjectOutputStreamoutputnewObjectOutputStream(newFileOutputStream(person.dat))){output.writeObject(person);}再通过反序列化恢复对象importjava.io.FileInputStream;importjava.io.ObjectInputStream;Personperson;try(ObjectInputStreaminputnewObjectInputStream(newFileInputStream(person.dat))){person(Person)input.readObject();}System.out.println(person.getName());反序列化会根据文件中的数据重新创建一个Person对象。对于普通实现了Serializable的类反序列化时通常不会调用该可序列化类的构造方法。使用场景反序列化常见于读取持久化对象 网络传输 缓存恢复 消息通信 对象深拷贝。不过Java 原生序列化存在性能、安全性和兼容性方面的问题。现代项目中更常见的是使用JSON Protocol Buffers Kryo Avro等格式传输或保存数据。特点根据已有的字节数据恢复对象 通常不会调用当前类的构造方法 类需要实现 Serializable 可能存在安全和版本兼容问题。不要反序列化不可信来源的数据否则可能带来安全风险。七、方式六使用工厂方法获得对象工厂方法是实际开发中非常常见的一种对象获取方式。例如classPerson{privateStringname;privatePerson(Stringname){this.namename;}publicstaticPersoncreate(Stringname){returnnewPerson(name);}}使用PersonpersonPerson.create(小明);表面上没有直接使用new而是通过Person.create()获得对象。不过需要注意工厂方法内部可能仍然使用了newreturnnewPerson(name);因此从 JVM 底层角度看最终可能还是由new创建对象但从调用者角度看对象是通过工厂方法获得的。工厂方法有什么好处1. 方法名更清晰Person.createAdmin();Person.createGuest();Person.fromDatabase(data);比多个含义不清晰的构造方法更容易理解。2. 可以返回缓存对象例如IntegeraInteger.valueOf(100);IntegerbInteger.valueOf(100);Integer.valueOf()可能返回缓存中的已有对象而不是每次都创建新对象。3. 可以返回子类对象AnimalanimalAnimalFactory.create(dog);工厂内部可以根据参数返回newDog()或者newCat()调用者不需要关心具体实现类。4. 可以统一控制创建过程工厂方法可以加入参数校验 缓存 对象池 权限检查 日志记录 依赖注入。常见例子Java 中有很多工厂方法Integer.valueOf(10);List.of(A,B);LocalDate.of(2026,7,12);Optional.of(Java);Executors.newFixedThreadPool(5);特点隐藏对象创建细节 方法名可以表达业务含义 可以返回缓存对象或子类对象 有利于降低代码耦合 内部不一定每次都创建新对象。严格来说“通过工厂方法获得对象”不一定意味着每次都创建了新对象因为它可能返回已有对象。八、使用 Unsafe 创建对象Java 底层还存在一种特殊方式通过Unsafe分配对象。概念上可以写成Personperson(Person)unsafe.allocateInstance(Person.class);它可以直接为对象分配内存但不会正常调用构造方法。Unsafe属于底层内部 API可能破坏 Java 的封装性和对象初始化规则一般业务开发中不应该使用。它更可能出现在JVM 底层工具 高性能框架 序列化框架 代理框架 特殊测试场景。对于初学者只需要知道这种方式存在即可不建议实际使用。九、这些方式是否都会调用构造方法不同创建方式对构造方法的调用情况不同。创建方式是否调用构造方法常见用途new会普通对象创建Constructor.newInstance()会反射、框架Class.newInstance()会调用无参构造旧式反射不推荐clone()通常不会复制已有对象反序列化当前可序列化类通常不会恢复对象工厂方法取决于内部实现封装创建逻辑Unsafe.allocateInstance()不会底层框架这是面试中经常考察的一个重点使用new和反射调用构造器会执行构造方法使用clone()和普通反序列化恢复当前类对象时通常不会调用该类构造方法。十、创建对象和获得对象有什么区别严格来说有些方式是“真正创建新对象”有些方式只是“获得一个对象”。例如IntegernumberInteger.valueOf(100);valueOf()可能返回缓存中的已有对象因此不保证一定创建新对象。再例如 SpringUserServiceuserServiceapplicationContext.getBean(UserService.class);这里是从 Spring 容器获取对象对象可能早已创建完成并不是此时才创建。因此下面两种说法存在细微区别创建对象明确产生一个新的对象实例 获得对象拿到一个对象引用可能是新对象也可能是已有对象。不过在初级面试题中工厂方法、Spring 容器等方式经常也会被归入“对象创建方式”进行讨论。十一、实际开发应该选择哪种方式普通业务对象优先使用newPerson();代码直观、简单。框架动态创建对象使用反射clazz.getDeclaredConstructor().newInstance();复制已有对象可以使用拷贝构造方法 clone() 手动字段复制。相比clone()很多项目更喜欢使用拷贝构造方法因为逻辑更加明确PersoncopiednewPerson(original);从文件、缓存或网络恢复对象可以使用反序列化但实际项目中通常优先考虑 JSON、Protobuf 等方案。隐藏复杂创建逻辑使用工厂方法PersonpersonPersonFactory.create(type);十二、常见面试问题1. Java 创建对象有哪些方式可以回答Java 创建或获得对象的常见方式包括使用 new 关键字、使用反射调用构造方法、通过 clone() 克隆对象、通过反序列化恢复对象以及通过静态工厂方法或工厂模式获得对象。其中Class.newInstance() 已经被废弃反射创建对象推荐使用 Constructor.newInstance()。2. 哪些方式不会调用构造方法可以回答使用 clone() 克隆对象通常不会调用构造方法通过 Java 反序列化恢复当前可序列化类对象时通常也不会调用该类构造方法Unsafe.allocateInstance() 同样不会调用构造方法。3. newInstance() 推荐使用哪一个推荐clazz.getDeclaredConstructor().newInstance();不推荐clazz.newInstance();因为后者已经被废弃并且只能调用无参构造方法。十三、总结Java 中常见的对象创建或获取方式包括1. new最常用会调用构造方法 2. Constructor.newInstance()通过反射调用构造方法 3. Class.newInstance()旧式反射方式已经废弃 4. clone()复制已有对象通常不调用构造方法 5. 反序列化从字节数据恢复对象 6. 工厂方法隐藏创建细节可能创建新对象也可能返回已有对象 7. Unsafe底层特殊方式不建议普通开发使用。初学者最需要掌握的是new 反射 clone 反序列化 工厂方法最后用一句话概括Java 创建对象不只有new还可以通过反射、克隆、反序列化和工厂方法等方式获得对象它们最大的区别在于创建过程是否调用构造方法、是否依赖已有对象以及是否真正生成新的对象实例。

相关新闻

Git bundle 与 tar/zip 备份对比:2种方案性能与完整性实测

Git bundle 与 tar/zip 备份对比:2种方案性能与完整性实测

Git Bundle 与 Tar/Zip 备份方案深度对比:性能与完整性实测报告在代码版本管理和数据备份领域,Git bundle 和传统的文件系统打包工具(如 tar、zip)是两种截然不同的技术路线。本文将通过 12 项核心指标的系统性测试,揭…

2026/7/13 0:40:07阅读更多 →
VS Code C# Dev Kit 1.0 配置指南:5个必装插件与 .NET 8 项目创建实战

VS Code C# Dev Kit 1.0 配置指南:5个必装插件与 .NET 8 项目创建实战

VS Code C# Dev Kit 1.0 配置指南:5个必装插件与 .NET 8 项目创建实战微软最新推出的C# Dev Kit扩展包彻底改变了VS Code的.NET开发体验。作为从Visual Studio迁移过来的老用户,我发现这套工具链不仅保留了VS的核心功能,还带来了更轻量高效的…

2026/7/13 0:40:07阅读更多 →
基于MediaPipe的智能手势控制PPT系统31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于MediaPipe的智能手势控制PPT系统31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于MediaPipe的智能手势控制PPT系统31(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 项目简介 本系统采用计算机视觉和深度学习技术,通过摄像头实时识别手势来控制PowerPoint演示,支持7种手势控制,包括翻页…

2026/7/13 0:40:07阅读更多 →
用PowerPoint+Paint打造可呼吸的数字黑板

用PowerPoint+Paint打造可呼吸的数字黑板

1. 项目概述:为什么物理课不能只靠PPT“念稿”?我带过七届大学物理实验课,也在线上教过三年理论课,最常被学生私信问的一句话是:“老师,您讲的推导过程能不能慢一点?我刚想记下中间步骤&#xf…

2026/7/13 1:55:14阅读更多 →
CTF 音频隐写实战:Audacity 与 MP3Stego 1.1.17 工具链的 5 步排查流程

CTF 音频隐写实战:Audacity 与 MP3Stego 1.1.17 工具链的 5 步排查流程

CTF 音频隐写实战:Audacity 与 MP3Stego 工具链的 5 步排查流程在CTF竞赛中,音频隐写题目往往让参赛者感到棘手。与图片隐写不同,音频文件包含更多维度的信息载体——时域波形、频域频谱、编码参数等都可能成为隐藏数据的媒介。本文将介绍一套…

2026/7/13 1:55:14阅读更多 →
Yelp数据EDA实战:从爬虫到业务洞察的系统性分析方法

Yelp数据EDA实战:从爬虫到业务洞察的系统性分析方法

1. 项目概述:从Yelp爬取数据到真正读懂它做Web Scraping,很多人卡在“能抓下来”就以为结束了——其实那只是万里长征第一步。我带过不少刚入门的数据爱好者,他们花两周时间调通Selenium脚本、绕过反爬、存下几万条Yelp餐厅评论,结…

2026/7/13 1:55:14阅读更多 →
浮动 vs Flex:CSS 布局的演进

浮动 vs Flex:CSS 布局的演进

> 如果面试官让你"聊一下 Flex",他其实是想听你讲清楚两件事:它解决了什么问题,以及你用过它的哪些核心功能。 > 本文从浮动到 Flex 的演进讲起,给你一份面试应答模板 核心知识点全覆盖。一、浮动 vs Flex 的核心…

2026/7/13 1:55:14阅读更多 →
号称一键把 AIGC 率降到个位数的工具靠谱吗?实测给你看

号称一键把 AIGC 率降到个位数的工具靠谱吗?实测给你看

号称一键把 AIGC 率降到个位数的工具靠谱吗?实测给你看 你大概是被那句"一键把 AIGC 率降到个位数"给勾住了,才点进来的。你现在的处境我猜得到:论文初稿是 AI 帮着写的,学校查重系统一跑,AIGC 率飘到六七十…

2026/7/13 1:55:14阅读更多 →
2026思维导图工具实测对比:10款工具AI/协作/易用性哪家强?附选型建议

2026思维导图工具实测对比:10款工具AI/协作/易用性哪家强?附选型建议

我花了三天时间,把目前市面上主流的10款思维导图软件从安装到深度使用全部走了一遍。不是翻官网介绍,而是真正模拟技术人日常场景:快速出图、AI辅助生成、团队协作、跨平台同步、以及长期沉淀的可迁移性。 这篇评测没有排行榜式的“谁第一”&…

2026/7/13 1:50:14阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/12 0:02:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/13 0:50:34阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/12 0:02:11阅读更多 →
卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…

2026/7/13 0:04:58阅读更多 →
语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text …

2026/7/13 0:04:58阅读更多 →
Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:04:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/11 16:20:28阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/11 23:15:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →