0

0

Java中如何通过new关键字创建对象_Java对象实例化解析

P粉602998670

P粉602998670

发布时间:2026-03-08 13:03:11

|

629人浏览过

|

来源于php中文网

原创

java中如何通过new关键字创建对象_java对象实例化解析

new 是怎么调用构造函数的

Java 中 new 不是“直接分配内存就完事”,它会严格按顺序做三件事:分配堆内存 → 调用构造函数 → 返回引用。构造函数没执行完,对象就算没“活过来”,哪怕内存已经分好了。

常见错误现象:NullPointerException 出现在构造函数里调用 this.xxx() 方法时——因为子类重写了该方法,而此时子类字段还没初始化(父类构造器中调用被子类覆盖的方法,子类字段仍是默认值)。

  • 永远别在构造函数里调用可被重写的方法(protectedpublic 实例方法)
  • 如果必须初始化逻辑复用,改用 private 方法或静态工厂方法
  • new 后面跟的必须是具体类(不能是接口或抽象类),否则编译报错:Cannot instantiate the type XXX

为什么有时候 new 不走你写的构造函数

你以为写了 public MyClass(String s) 就万事大吉?不一定。如果类里没写任何构造函数,编译器自动加一个无参构造器;但只要你写了任意一个构造器,那个“默认无参构造器”就没了。

使用场景:Spring、Jackson、Hibernate 这些框架大量依赖无参构造器做反射实例化。你加了一个带参构造器又忘了补 public MyClass() {},框架一 new 就抛 InstantiationExceptionIllegalAccessException

立即学习Java免费学习笔记(深入)”;

Q.AI视频生成工具
Q.AI视频生成工具

支持一分钟生成专业级短视频,多种生成方式,AI视频脚本,在线云编辑,画面自由替换,热门配音媲美真人音色,更多强大功能尽在QAI

下载
  • 只要类要被框架反序列化或注入,就显式声明 public MyClass() {}
  • IDE 自动生成构造器时,注意检查是否覆盖了无参构造器
  • 如果真不想暴露无参构造器,得配好框架的替代方案(比如 Jackson 的 @JsonCreator

new 和 Class.forName().newInstance() 有啥实质区别

new 是编译期绑定,类型确定、快、安全;Class.forName().newInstance() 是运行时反射创建,要求类必须有可访问的无参构造器,且在 Java 9+ 已被标记为废弃(内部用 Constructor.newInstance() 替代)。

性能影响:反射创建比 new 慢 10–100 倍(取决于 JVM 优化程度),而且绕过编译检查,容易在运行时报 NoSuchMethodExceptionInvocationTargetException

  • 别为了“看起来灵活”滥用反射创建实例,除非真需要动态类型(如插件系统)
  • Java 9+ 必须用 clazz.getDeclaredConstructor().newInstance(),并手动处理 setAccessible(true)(如果构造器是 private
  • new 支持泛型推导(如 new ArrayList()),反射做不到

对象没 new 成功,但内存可能已经泄漏了

构造函数里开线程、注册监听器、打开文件流,结果中途抛了异常(比如 IOException),对象没建出来,但资源已经分配出去了——这些资源不会自动回收。

典型错误现象:程序跑一阵后 OutOfMemoryError: unable to create new native thread,查下来发现是某个类的构造器里起了线程却没兜住异常。

  • 构造函数里尽量只做字段赋值和简单校验,避免副作用操作
  • 真要初始化资源,请用“两阶段构造”:先 new,再调用 init() 方法,并确保 init() 可重入或幂等
  • 或者改用静态工厂方法,在返回前完成清理(try-with-resources + finally)
事情说清了就结束。构造器不是普通方法,new 也不是语法糖——它卡在语义、JVM 规范和框架契约的交汇点上,漏掉任何一个细节,问题都会在最意想不到的时候冒出来。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

154

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

157

2024.02.23

Hibernate框架介绍
Hibernate框架介绍

本专题整合了hibernate框架相关内容,阅读专题下面的文章了解更多详细内容。

91

2025.08.06

Java Hibernate框架
Java Hibernate框架

本专题聚焦 Java 主流 ORM 框架 Hibernate 的学习与应用,系统讲解对象关系映射、实体类与表映射、HQL 查询、事务管理、缓存机制与性能优化。通过电商平台、企业管理系统和博客项目等实战案例,帮助学员掌握 Hibernate 在持久层开发中的核心技能。

39

2025.09.02

Hibernate框架搭建
Hibernate框架搭建

本专题整合了Hibernate框架用法,阅读专题下面的文章了解更多详细内容。

72

2025.10.14

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

970

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

970

2023.08.02

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 10.8万人学习

Java 教程
Java 教程

共578课时 | 78.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号