传递的是值的引用, 也就是说传递前和传递后都指向同一个引用(也就是同一个内存
空间)。
示例如下:
第1行 public class TempTest {
第2行 private void test1(A a){
第3行 a. age = 20;
第4行 System. out.println("test1方法中的age="+a. age);
第5行 }
第6行 public static void main(String[] args) {
第7行 TempTest t = new TempTest();
第8行 A a = new A();
第9行 a. age = 10;
第10行 t.test1(a);
第11行 System. out.println("main方法中的age="+a. age);
第12行 }
第13行 }
第14行 class A{
第15行 public int age = 0;
第 16 行 }
运行结果如下:
test1方法中的age=20
main 方法中的 age=20
理解按引用传递的过程——内存分配示意图
要想正确理解按引用传递的过程, 就必须学会理解内存分配的过程, 内存分配示意图可
以辅助我们去理解这个过程。
用上面的例子来进行分析:
( 1):运行开始, 运行第 8 行,创建了一个 A 的实例, 内存分配示意如下:
main 方法中的变量 a
( 2):运行第 9 行,是修改 A 实例里面的 age 的值,运行后内存分配示意如下:
main 方法中的变量 a
这是一个 A 的实例
此时 age = 0;
这是一个 A 的实例
此时 age = 10;
( 3): 运行第 10 行,是把 main 方法中的变量 a 所引用的内存空间地址, 按引用传递给 test1
方法中的 a 变量。 请注意:这两个 a 变量是完全不同的, 不要被名称相同所蒙蔽。
内存分配示意如下:
main 方法中的变量 a
赋值给 (按引用传递)
test1 方法中的变量 a
由于是按引用传递, 也就是传递的是内存空间的地址, 所以传递完成后形成的新的内存
示意图如下:
main 方法中的变量 a
test1 方法中的变量 a
也就是说:是两个变量都指向同一个空间。
( 4):运行第 3 行,为 test1 方法中的变量 a 指向的 A 实例的 age 进行赋值, 完成后形成的
新的内存示意图如下:
main 方法中的变量 a
test1 方法中的变量 a
此时 A 实例的 age 值的变化是由 test1 方法引起的
( 5):运行第4行, 根据此时的内存示意图, 输出test1方法中的age=20
( 6):运行第 11 行, 根据此时的内存示意图, 输出 main 方法中的 age=20
要想正确理解按引用传递的过程, 就必须学会理解内存分配的过程, 内存分配示意图可
以辅助我们去理解这个过程。
用上面的例子来进行分析:
( 1):运行开始, 运行第 8 行,创建了一个 A 的实例, 内存分配示意如下:
main 方法中的变量 a
( 2):运行第 9 行,是修改 A 实例里面的 age 的值,运行后内存分配示意如下:
main 方法中的变量 a
这是一个 A 的实例
此时 age = 0;
这是一个 A 的实例
此时 age = 10;
( 3): 运行第 10 行,是把 main 方法中的变量 a 所引用的内存空间地址, 按引用传递给 test1
方法中的 a 变量。 请注意:这两个 a 变量是完全不同的, 不要被名称相同所蒙蔽。
内存分配示意如下:
main 方法中的变量 a
赋值给 (按引用传递)
test1 方法中的变量 a
由于是按引用传递, 也就是传递的是内存空间的地址, 所以传递完成后形成的新的内存
示意图如下:
main 方法中的变量 a
test1 方法中的变量 a
也就是说:是两个变量都指向同一个空间。
( 4):运行第 3 行,为 test1 方法中的变量 a 指向的 A 实例的 age 进行赋值, 完成后形成的
新的内存示意图如下:
main 方法中的变量 a
test1 方法中的变量 a
此时 A 实例的 age 值的变化是由 test1 方法引起的
( 5):运行第4行, 根据此时的内存示意图, 输出test1方法中的age=20
( 6):运行第 11 行, 根据此时的内存示意图, 输出 main 方法中的 age=20