Java 技巧传参方式: 按值调用
发布时间:2021-11-18 14:29:58 所属栏目:教程 来源:互联网
导读:程序设计语言中将参数传递给方法的几种方式: 按名调用(call by name): Algol 语言采用此方式, 已成为历史; 按值调用(call by value): 方法接收到的是调用者提供的 变量值; 按引用调用(call by reference): 方法接受到的是调用者低筒的 变量地址; C++ 支持 按
|
程序设计语言中将参数传递给方法的几种方式: 按名调用(call by name): Algol 语言采用此方式, 已成为历史; 按值调用(call by value): 方法接收到的是调用者提供的 变量值; 按引用调用(call by reference): 方法接受到的是调用者低筒的 变量地址; C++ 支持 按值调用 和 按引用调用: void func(int arg); // 按值调用; void func(int& arg); // 按引用调用; 而 Java 只支持 按值调用, 也就是说方法得到的是所有参数值的一个拷贝, 在方法内对参数值进行修改是不会影响原值的. 然而方法参数有两种类型: 基本数据类型: 数字, 布尔值; 对象引用. 当方法参数是 对象引用 时, 在方法很容易的调用其 setXXX 方法修改该对象属性值, 在退出方法后该修改仍然有效, 但这仍旧只是 按值调用. 因为参数是 对象引用, 在该方法内仍旧执行原对象(类似 C++ 的指针), 调用它的 setXXX 方法当然能修改对象属性了. 但也仅限于修改对象属性(状态), 而不能通过 new 等方式对原对象进行修改. 如果还有疑问, 就请看看这个例子: class MyObject { private String name; MyObject(String name) { this.name = name; } } staticvoidswap(MyObject first, MyObject second) { MyObject temp = first; first = second; second = first; } staticvoidtestSwap() { MyObject a = new MyObject("a"); MyObject b = new MyObject("b"); swap(a, b); } 请问在执行 swap() 函数后, 对象 a 和 对象 b 的 name 是否变化? 答案是没有变化. 在 testSwap() 方法中, first 和 second 完成交换并分别指向对方. 但是, 在进入方法时, 它们拿到的是对象引用的拷贝(位置), 类似于: 进入 swap() 方法前, a 知道在内存地址为 100 的地方存储了一个 MyObject 对象, 'b' 知道在内存地址为 200 的地方存储了另一个 MyObject 对象; 进入 swap() 方法时, a 将它的对象引用复制一份给 first, 也就是说 first 知道内存地址为 100 的地方有一个 MyObject 对象. second 同理; 在退出 swap() 方法时, first 与 second 交换值, 也就是说 first 知道内存地址为 200 的地方有一个 MyObject 对象, 它已经跟内存地址为 100 的 MyObject 对象没有任何关系了. second 同理; 在退出 swap() 方法后, first 与 second 被销毁, a 仍旧是知道内存地址为 100 的地方有一个 MyObject 对象... 其实, 这就是 C/C++ 的指针. 顺便说一句, 通过 C++ 的 按引用调用 可以很方便实现 swap() 函数. 当然, 用指针也是支持滴, 只不过稍微复杂点(这里只给出声明, 有兴趣的同学自己去写实现吧): MyObject* a = new MyObject("a"); MyObject* b = new MyObject("b"); void swap(MyObject& first, MyObject& second); // C++ 引用 void swap(MyObject **first, MyObject **second); // C/C++ 指针版 swap 综上, java 中的方法参数: 不能修改一个基本数据类型的参数(即数值型或布尔型); 可以改变一个对象参数的状态; 不能让对象参数引用一个新的对象. ![]() (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



浙公网安备 33038102330482号