Java Core摘要--方法参数

首先回顾一下在程序设计语言中有关参数传递给方法(或函数)的一些专业术语。值调用(call by value)表示方法接收的是调用者提供的值。而引用调用(call by refrence)表示方法接收的是调用者提供的变量位置。可以想到,一个方法可以修改传递引用所对应的的变量值,而不是能修改传递值调用所对应的的变量值。这一点不仅仅是java语言,其他程序设计语言也是如此。调用(call by)是一标准的计算机科学术语,他用来描述各个程序设计语言中方法参数的传递方式。
Java 程序设计语言使用的是值调用。也就是说,方法得到的是所有参数值得一个拷贝,特别,方法不能修改传递个给它的任何参数变量的内容。
例如,考虑下面的调用:
double percent  =10;
       harry.raiseSalary(percent);
不必理睬这个方法的具体实现,再方法调用之后,percent的值仍然是10。
下面再仔细研究一下这种情况。假定一个方法试图将一个参数值增加至3倍。
public static void tripValue(double x){
    x=3*x;
}
 然后调用这个方法:
doublc percent = 10;
tripValue(percent);
  可以看到,无论怎么调用这个方法,执行之后percent的值都还是10。下面看一下具体的执行过程:
1)x被初始化为percent值得一个拷贝(也就是10)。
2)x被乘以3后等于30,但percent仍然是10。
3)这个方法结束之后,参数变量x不在被使用。
然而方法的参数共有两种基本类型:
基本数据类型(数字、布尔值)。
对象引用。
已经看到,一个方法不可能修改一个基本数据类型的参数。而对象引用作为参数就不同了,我们可以很容易地利用下面的这个方法实现将一个雇员的薪金提高两倍的操作:
public static void tripleSalary(Employee x){
    x.raiseSalary(200);
}
当调用
harry = new Employee(...)
trpileSalary(harry);
的具体执行过程为:
1)x被初始化为harry值的拷贝,这里是一个对象的引用。
2)rasizeSalary方法应用于这个对象的引用。x和harry同时引用的那个Employee对象的薪金提高了200%。
3方法结束后,参数变量x不再被使用。当然,对象变量harry继续引用那个薪金增值3倍的雇员对象。
已经看到,实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到是对象引用的拷贝,对象引用及其他的拷贝同时应用同一个对象。
很多程序设计语言(特别是,C++和Pascal)提供了两种参数传递的方式:值调用和引用调用。有些程序员认为Java程序设计语言对对象才用的是引用调用,实际上这种理解是不对的。由于这种误解具有一定得普遍性,所以下面给出一个范例,来详细的阐述一下这个问题。
首先编写一个交换两个雇员对象的方法:
public static void swap(Empolyee x,Empolyee y){
    Empolyee temp = x;
    x=y;
    y=temp;
}
如果Java程序设计语言对对象采用的是引用调用的的话,这个方法应该能够实现交换数据对象的效果:
Empolyee a = new Empolyee("Alice",,,);
Empolyee a = new Empolyee("Bob",,,);
swap(a,b);
//does a now refer to Bob,b to Alice?
但是方法并没有改变存储在变量a和b中的对象引用。swap方法的参数x和y被初始化为两个对象的引用拷贝,这个方法交换的是这两个拷贝。
//x refers to Alice,y to Bob
Empolyee temp = x;
x=y;
y=temp;
// now x refers to Boy,y to Alice
最终,白费力气。在方法结束时参数变量x和y被丢弃了。a仍然引用Alice,b引用Bob。
这个过程说明:Java 程序设计语言对象的采用的不是引用调用,实际上对象引用进行的是值传递。
下面,总结一下在Java程序设计语言中,方法参数的的使用情况:

  • 一个方法不能修改基本数据类型的参数(及数值型和布尔型值)
  • 一个方法可以改变一个对象参数的状态。
  • 一个方法不能让对象参数引用一个新的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值