加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

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编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读