Java中对象变量本质是引用,存储堆中对象地址而非对象本身;声明时在栈分配空间存null,new时在堆创建实例;多变量可共享同一堆对象;变量作用域结束仅销毁栈中引用,堆对象存活取决于是否仍有强引用;==比较地址,equals比较内容。

Java 中的对象变量本质上是引用,它存储的是堆内存中对象实体的地址,而不是对象本身。声明一个对象变量时,JVM 会在栈中分配一小块空间来存放这个引用值;而用 new 创建对象时,实际的数据(即对象实例)被分配在堆内存中。
对象变量的声明与初始化分离
对象变量可以先声明,后初始化,此时它默认值为 null,表示尚未指向任何堆中对象:
- String str; // 声明,str 在栈中,值为 null,不指向堆中任何位置
- str = new String("hello"); // 初始化:在堆中创建 String 实体,str 存储其地址
多个变量可引用同一个堆对象
引用变量赋值是地址拷贝,不是对象复制。因此多个变量可以共享同一块堆内存:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- List<Integer> list1 = new ArrayList<>(); // 堆中新建 ArrayList 实例
- List<Integer> list2 = list1; // list2 复制了 list1 的引用值,两者指向同一对象
- list2.add(10); // 修改通过 list2,list1 也能看到该变化
引用变量的作用域和生命周期独立于对象
变量在栈中存在,随作用域结束而销毁;但堆中的对象是否被回收,取决于是否还有活跃引用指向它:
立即学习“Java免费学习笔记(深入)”;
- void method() { List<String> tmp = new ArrayList<>(); tmp.add("a"); } // 方法结束,tmp 变量消失
- 但若 tmp 所指对象此前已被其他变量(如成员变量、静态变量或已返回给调用方)引用,则该对象仍存活在堆中
- 只有当没有任何强引用可达该对象时,GC 才可能在后续回收它
用 == 和 equals 区分引用与内容比较
理解引用本质有助于正确判断对象关系:
- == 比较两个变量的引用值是否相同(即是否指向堆中同一地址)
- equals() 默认行为同 ==,但多数类(如 String、Integer)重写了它,用于比较对象内容逻辑是否相等
- String a = new String("abc"); String b = new String("abc"); System.out.println(a == b); // false(不同地址)
- System.out.println(a.equals(b)); // true(内容相同)

















