0

0

如何在Java中创建类和对象_面向对象编程基础入门与内存分配

P粉602998670

P粉602998670

发布时间:2026-03-15 14:23:03

|

330人浏览过

|

来源于php中文网

原创

Java中new对象触发类加载、初始化、堆分配、引用建立四步;构造器不自动补默认方法,字段初始化顺序固定,对象销毁不等于立即回收,资源需显式关闭。

如何在java中创建类和对象_面向对象编程基础入门与内存分配

Java里new一个对象到底发生了什么

不是简单分配内存,而是触发类加载、初始化、堆空间分配、引用建立四步连环操作。没理解这点,遇到NullPointerException或静态块不执行时容易懵。

实操建议:

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

  • 类首次被newstatic字段访问、反射调用时才触发ClassLoader.loadClass()<clinit></clinit>(静态初始化块)
  • 真正分配堆内存的是JVM的object allocation流程,受GC策略影响——比如G1下大对象可能直接进Humongous Region
  • 栈上只存引用变量(如MyClass obj),obj本身不存对象,对象实体永远在堆里
  • 别在构造器里传this出去——此时对象可能还没初始化完,其他线程拿到的是半成品

构造方法不是函数,不能随便重载或省略

Java不会自动补默认构造方法,一旦你写了带参构造,无参构造就没了。这是新手写完public Person(String name)后,再new Person()直接报Compilation error: constructor Person() is not defined的根源。

实操建议:

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

  • 如果需要无参构造,必须显式写public Person() {},哪怕空着
  • 构造方法里调用另一个构造要用this(...),且必须是第一行;调用父类构造用super(...),也必须第一行——顺序错会编译失败
  • 避免在构造方法里做耗时操作(如IO、网络请求),既拖慢对象创建,又破坏单一职责
  • 考虑用静态工厂方法替代构造器,比如Person.createAdult(String name),语义更清晰,还能返回子类或缓存实例

成员变量初始化顺序决定bug藏在哪

字段声明顺序、初始化块、构造方法三者执行顺序固定:父类静态 → 子类静态 → 父类实例字段/块 → 父类构造 → 子类实例字段/块 → 子类构造。这个顺序错一点,final字段可能被赋值两次,或者String字段还是null就被用了。

灵机语音
灵机语音

灵机语音

下载

实操建议:

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

  • 把所有字段初始化写在声明处(如private List<string> items = new ArrayList();</string>),比放在构造器里更安全、更易读
  • 避免在实例初始化块里调用可被重写的方法(protectedpublic),子类构造前父类就可能调到子类未准备好的逻辑
  • final字段必须在构造结束前明确赋值,否则编译报错;但若用static final,就得在声明时或静态块里赋值
  • 调试时加个System.out.println("in field init")就能快速验证执行流,比猜快得多

对象销毁不等于内存立刻回收

Java没有析构函数,finalize()已被标记为@Deprecated且不保证执行。你调obj = null只是断开引用,对象是否回收取决于GC时机和可达性分析结果——这点常被当成“内存泄漏”的假警报。

实操建议:

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

  • 资源型对象(FileInputStreamConnection)必须显式close(),用try-with-resources最稳妥
  • 监听器、回调、缓存引用这些容易造成强引用链的地方,优先用WeakReferenceSoftReference
  • 别依赖System.gc()——它只是建议,JVM可以忽略;真要观察回收行为,用jstat -gc <pid>看实际YGC/FGC次数
  • 局部变量超出作用域后,只要没逃逸(escape analysis判定),JVM可能直接栈上分配,根本不上堆——所以别一概而论“所有对象都在堆里”

类设计时最容易被忽略的,其实是字段的可见性与初始化时机耦合。一个private volatile List<String> cache,如果在构造器里只做了cache = new ArrayList<>(),那后续多线程往里add依然可能出问题——得配合同步或用Collections.synchronizedList()。这种细节,光看语法对不对没用,得盯住运行时行为。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

1051

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1111

2024.03.01

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

65

2025.11.27

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

493

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

76

2025.10.23

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

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

精品课程

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

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.4万人学习

Java 教程
Java 教程

共578课时 | 82.6万人学习

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

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