https://cs61b-2.gitbook.io/cs61b-textbook/3.-references-recursion-and-lists

Reference type

除了 Java 的 8 种基本(primitive)类型(byte、short、int、long、float、double、boolean 和 char)外的类型都称作引用类型(reference type):包含类(class)、数组(array)等

等式黄金法则:当你写 y = x 时,你是在告诉 Java 解释器将 x 中的 bits 复制到 y 中

  • 例如:创建类的实例时,如果对同一个类的两个变量执行 变量A = 变量B 操作,
  • 则实际上这两个变量指向的是同一个实例,也就是说它们复制的是内存地址,具体说明见下文。

理解对象实例化和声明的过程

考虑以下代码

1
2
3
4
5
6
7
8
9
public static class Walrus {
public int weight;
public double tuskSize;

public Walrus(int w, double ts) {
weight = w;
tuskSize = ts;
}
}

使用 new Walrus(1000, 8.3) 创建一个海豹,会得到一个包含两个 32 位和 64 位盒子的海象,因为 int 类型占 32 位,double 类型占 64 位:
Pasted image 20260304193900

现在海豹已经被创建,但没有被存储在任何变量中,因此需要声明。

同时,在声明任何引用类型的变量时,java 都会保存一个对象引用(一个盒子)。这个引用(盒子)指向海豹在内存中的地址,而不是海豹的数据。具体占用多少位由 JVM 和运行环境决定。

为方便理解,我们可以用一个箭头来表示内存中的地址

Pasted image 20260304194145


考虑以下代码

1
2
3
Walrus a = new Walrus(1000, 8.3);
Walrus b;
b = a;

根据等式黄金法则,等号的含义是告诉 Java 将 a 中的比特(bits)复制到 b 中。由于 a 中存储的是内存地址,因此复制后 b 中的比特也变成了相同的内存地址,从而指向同一个对象。

为方便理解,可以看作 b 复制了 a 的箭头,最终也拥有一个指向相同对象的箭头。
Pasted image 20260304194357