按引用传递的
来源:互联网 发布:新东方烹饪怎么样知乎 编辑:程序博客网 时间:2024/05/22 00:22
传递的是值的引用, 也就是说传递前和传递后都指向同一个引用(也就是同一个内存
空间)。
示例如下:
第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
- 按引用传递的
- 引用传递(传递对象的引用)
- 按值传递和按引用传递的区别
- 引用类型参数的按值传递
- PHP函数按引用传递的例子
- 动态数组按值传递的引用
- 采用按引用传递的选择排序
- C++按引用传递参数的问题
- 关于C#中按值传递和按引用传递的测试
- Java中按值传递与按引用传递的区别
- Java里的按值传递与引用传递
- Java里的按值传递与引用传递
- 按值传递和引用传递的区别
- Java里的按值传递与引用传递
- C++按值传递对象和传递引用的选择
- Java中按值传递与按引用传递的区别
- Java中按值传递和按引用传递的区别
- Java中按值传递与按引用传递的区别
- ios进程间通信问题之二----XPC Service
- EventBus的使用和原理剖析
- 【poj 2352】Stars 题意&题解&代码(C++)
- CF236 B. Easy Number Challenge【求约数个数】
- 【poj 1182】 食物链 题解&代码(C++)
- 按引用传递的
- jQuery立即调用表达式
- QuartZ--Spring中定时任务的实现
- linux 命令route add default dev eth0和route add default gw * dev eth0的区别?
- 书已出,只要能帮助或影响1000人,也算是功德圆满
- arc/非arc转换及注意事项
- js的this指向
- 运行时的C程序
- 《软件架构设计》学习笔记--6--6大步骤2:领域建模