对象

返回 Java 基础

Java 里一切皆对象(除 8 种基本类型及其数组在语法上特殊外):是模板(元数据在 Metaspace),实例是堆上的对象。本文是对象相关知识的总览与索引;细节以各专题文为准,避免多处重复展开。


文档分工(对象主题)

文档负责什么不负责什么
本文 · 对象概念地图、学习路径、跨文档索引不展开 GC 算法、不展开 JUC API 全集
面向对象封装/继承/多态、Object 方法、equals/hashCode 写法堆布局、GC、并发
JVM堆上布局创建五步分配路径、Mark Word 字段 / lock bits锁升级、wait、JMM
垃圾回收存活判断、引用强度、晋升/回收、收集器锁升级、happens-before
JMM多线程可见性/有序性、hb、安全发布堆布局、锁升级实现
JUCsynchronized锁升级wait/JUC 锁、sleep vs waitMark Word 位图、GC

JVM 内存结构 ≠ JMM:前者管「对象在堆哪、怎么分配」;后者管「多线程能否看见彼此的写」。见 与 JVM「内存结构」的区别


知识地图

                    ┌────────────── 对象(本文)──────────────┐
                    │  引用 · 创建 · 布局索引 · 生命周期索引   │
                    └────────────────────────────────────────┘
           ┌────────┼────────┬────────────┬────────────┐
           ▼        ▼        ▼            ▼            ▼
    [[面向对象]]  [[JVM]]  [[垃圾回收]]  [[JMM]]    [[JUC]]
    语言语义      堆·头·new   活/死·晋升    可见·发布    锁·wait

按问题找文档

你想搞懂…先看
引用、==equals、多态面向对象
new 之后内存里长什么样、对象头、Eden 分配JVM · JVM
对象什么时候被回收、强软弱虚、为什么还占内存垃圾回收 · 垃圾回收
为什么别的线程看不见我的修改、DCL 为何要 volatileJMM
synchronized 锁谁、wait 放不释放锁JUC · JUC
偏向锁、轻量级锁、重量级锁怎么升级JUC
单例半初始化、安全地把对象交给别的线程JMM · JUC

引用与实例

概念说明
引用变量存地址;null 表示未指向任何实例
实例new 在堆上的对象(对象头 + 字段)
Metaspace 中的元数据;一个类 → 多个实例
Person a = new Person("Alice");
Person b = a;   // 同一实例的两个引用
  • ==:同一实例(引用相等)
  • equals():默认同 ==;重写后多为值相等 → Object 类核心方法

对象的创建

方式主文档
newJVM(五步)、JVM(TLAB/Eden)
反射反射
clone()面向对象 · 下文「拷贝」
反序列化序列化
工厂/建造者设计模式

new 五步(权威在 JVM):类加载检查 → 分配内存 → 零值 → 设置对象头<init>


堆上的内存布局(摘要)

权威说明:对象在堆上的内存布局 · 对象头(Mark Word)

对象实例
├── 对象头:Mark Word(哈希/GC 年龄/锁状态)+ Klass 指针
├── 实例数据
└── 对齐填充

锁与对象头synchronized / wait 作用在具体实例(或 Class)上,锁状态记在 Mark Word。
锁升级(无锁→偏向→轻量→重量):锁升级(Lock Escalation)
可见性(退出锁后别的线程能否看见写)由 synchronized 的 happens-before 保证,与「当前是轻量还是重量」是两层问题。


Object 类(摘要)

完整 API 与示例:Object 类核心方法

方法一句话
equals / hashCode集合键、值相等契约
wait / notify条件协作,须已持有该对象锁 → JUC
clone浅拷贝
finalize已废弃

生命周期与 GC(摘要)

权威说明:对象存活判断 · 对象晋升与老年代

new → Eden(TLAB)→ Minor GC → Survivor(年龄+1)→ 达阈值 → 老年代 → 不可达 → 回收
  • 活着:从 GC Roots 可达(含被 synchronized 持有的对象,见 对象存活判断
  • 引用强度:强 / 软 / 弱 / 虚 → 引用类型
  • finalize:勿用;见 GC 文两次标记说明

拷贝

方式行为
b = a只多一个引用
clone()浅拷贝
序列化 / 拷贝构造深拷贝 → 序列化

线程与对象(摘要)

场景要点主文档
synchronized(obj)obj 实例JUC
sleep不释放JUC
wait释放 Monitor同上 + JMM
volatile 字段可见性,不保证 i++JMM · JUC
安全发布别让别的线程看到半初始化对象JMM
ThreadLocal线程池要 removeJUC

易混概念

概念区别
基本类型 vs 包装类int 非对象;Integer 是对象
Class 对象类元数据的镜像,≠ 普通业务实例
Metaspace类元数据;才是实例 → JVM
String 常量池字面量可能复用;new String 仍新建实例

推荐学习顺序

  1. 面向对象 — 会用对象与 Object API
  2. JVM — 实例在堆上如何创建与布局
  3. 垃圾回收 — 实例何时被回收
  4. JMMJUC — 多线程下的对象状态与锁(先规范后 API)
  5. 反射 · 序列化 · 类加载 — 扩展

相关链接