java引用数据类型本质上是存储对象内存地址的变量,而非对象本身;其变量存于栈中,指向堆中实际对象,支持多引用共享同一对象、传地址副本等核心机制。

Java 中的引用数据类型,本质上是指向对象内存地址的“标签”,不是对象本身。理解这点,就抓住了 Java 对象操作的核心逻辑。
引用变量不等于对象
声明一个引用变量,比如 String str;,只是创建了一个可以存放地址的“盒子”,此时它指向 null,没有关联任何对象。真正创建对象要靠 new(或字符串字面量等特殊方式):
- String str = new String("hello"); —— 在堆中新建字符串对象,str 存储该对象的地址
- String s1 = "abc"; String s2 = "abc"; —— 可能共用字符串常量池中的同一个对象,s1 和 s2 存储的是相同地址
多个引用可指向同一个对象
这是理解 Java 参数传递和对象共享的关键。例如:
- ArrayList
list1 = new ArrayList(); -
ArrayList
list2 = list1; —— list2 并未复制列表,只是拿到了 list1 所指对象的同一地址 - 后续调用 list2.add("x");,list1.size() 也会变成 1,因为它们操作的是堆中同一个 ArrayList 实例
赋值、传参、返回值都是“传地址的副本”
Java 没有真正的“引用传递”,而是把引用变量里的地址值复制一份来传递:
- 方法内让形参指向新对象(如 obj = new Person();),不会影响实参原来的指向
- 但通过形参修改对象状态(如 obj.setName("Tom");),会影响原对象,因为地址副本仍指向同一块堆内存
常见引用类型有哪些
除 class 自定义类型外,Java 内置的引用类型包括:
- 数组:int[] arr = new int[5]; —— arr 是引用,指向堆中连续的 5 个 int 空间
-
接口类型:List
list = new ArrayList(); —— list 引用的是实现了 List 接口的具体对象 - 枚举(enum)、注解(@interface)、包装类(Integer, Boolean 等) —— 全部是 class,所以也是引用类型
弄清“引用存地址、对象在堆、操作靠指向”,Java 的对象行为就不再神秘。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











