引用赋值
基础概念
基本类型 vs 引用类型
特性 | 基本类型(Primitive) | 引用类型(Reference) |
---|---|---|
存储内容 | 直接存储数据值(如 int a = 10;) | 存储对象的内存地址(如 String s = “Hello”;) |
赋值行为 | 复制值(独立修改) | 复制地址(共享对象) |
默认值 | 零值(如 0、false) | null |
示例类型 | int, char, double | 类、数组、接口、枚举 |
以下是代码示例:
// 基本类型:值复制
int a = 10;
int b = a;
b = 20;
System.out.println(a); // 输出 10(a 未变)
// 引用类型:地址共享
class Person {
String name;
Person(String name) {
this.name = name; }
}
Person p1 = new Person("Alice");
Person p2 = p1;
p2.name = "Bob";
System.out.println(p1.name); // 输出 "Bob"(共享对象)
引用变量的声明与初始化
声明方式
ClassName obj; // 声明一个引用变量,初始值为null
初始化方法
方式 | 示例 | 说明 |
---|---|---|
new 关键字 | obj = new ClassName(); | 调用构造函数创建新对象 |
直接赋值 | String s = “Java”; | 指向常量池或已有对象 |
null 赋值 | obj = null; | 明确表示不指向任何对象 |
方法返回 | List list = getList(); | 接收方法返回的对象引用 |
内存模型:栈与堆
区域 | 存储内容 | 生命周期 |
---|---|---|
栈 | 局部变量(基本类型值、引用地址) | 方法执行时创建,方法结束自动释放 |
堆 | 对象实例、数组 | 由垃圾回收器(GC)管理 |
以下是代码示例:
void example() {
int a = 10; // a在栈中
String s = new String(); // s的引用在栈中,对象在堆中
}
引用赋值机制
引用传递的本质
Java 严格按值传递:基本类型传递值副本,引用类型传递引用地址副本。
void modify(int num, List<String> list) {
num = 20; // 不影响外部的 num
list.add("Modified"); // 修改影响外部对象
list = new ArrayList<>(); // 仅改变方法内的引用副本
}
public static void main(String[] args) {
int x = 10;
List<String> data = new ArrayList<>();
modify(x, data);
System.out.println(x); // 输出 10
System.out.println(data); // 输出 [Modified]
}
共享对象风险:多个引用指向同一对象时,修改会影响所有引用。
List<String> list1 = new ArrayList<>();
List<String> list2 = list1;
list2.add("Item");
System.out.println(list1); // 输出 [Item]
对象比较:== vs equals()
操作 | 比较内容 | 示例 |
---|---|---|
== | 引用地址是否相同 | new String(“A”) == new String(“A”) → false |
equals() | 对象内容是否相等(需正确重 |