按引用传递的

来源:互联网 发布:新东方烹饪怎么样知乎 编辑:程序博客网 时间:2024/05/22 00:22
按引用传递的重要特点
传递的是值的引用, 也就是说传递前和传递后都指向同一个引用(也就是同一个内存
空间)。
示例如下:
1public class TempTest {
2private void test1(A a){
3行 a.age = 20;
4行 System.out.println("test1方法中的age="+a.age);
5行 }
6public 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行 }
14class A{
15public 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


0 0
原创粉丝点击