ad

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_4.5 方法参数

admin 69 2023-10-25

【摘要】 本书摘自《Java核心技术》一书中第1章,第1节,作者是来自美国的凯·S.霍斯特曼(Cay S.Horstmann),由林琪、苏钰涵等译。

4.5 方法参数

首先回顾一下在程序设计语言中关于如何将参数传递给方法(或函数)的一些专业术 语。按值调用 (call by value) 表示方法接收的是调用者提供的值。而按引用调用 (call by reference)表示方法接收的是调用者提供的变量地址。方法可以修改按引用传递的变量的值, 而不能修改按值传递的变量的值。“按……调用”(call by)是一个标准的计算机科学术语,用 来描述各种程序设计语言(不只是Java) 中方法参数的传递方式(事实上,以前还有按名调 用 (call by name),Algol程序设计语言是最古老的高级程序设计语言之一,它使用的就是这 种参数传递方式。不过,这种传递方式已经成为历史)。

Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个副 本。具体来讲,方法不能修改传递给它的任何参数变量的内容。

例如,考虑下面的调用:

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_4.5 方法参数

double percent = 10;

harry.raisesalary(percent);

不论这个方法具体如何实现,我们知道,在这个方法调用之后, percent 的值还是10。 下面再仔细研究一下这种情况。假定一个方法试图将一个参数值增加至3倍:

public static void tripleValue(double x)// doesn't work

x =3*x;

}

然后调用这个方法:

double percent = 10;

tripleValue(percent);

不过,这样并不能起作用。调用这个方法之

后, percent的值还是10。下面看一下具体的执行

过程:

1.x初始化为percent 值的一个副本(也就是10)。

2.x 乘以3后等于30,但是percent仍然是10

(如图4-6所示)。

3.这个方法结束之后,参数变量x 不再使用。

然而,有两种类型的方法参数:

● 基本数据类型(数字、布尔值)。

● 对象引用。

你已经看到, 一个方法不可能修改基本数据类型的参数,而对象引用作为参数就不同了,可以很容易地利用下面这个方法将一个员工的 工资增至三倍:

public static void tripleSalary(Employee x)// works

{

x.raisesalary(200);

}

当调用

harry = new Employee(...);

triplesSalary(harry);

时,具体的执行过程为:

1.x初始化为harry值的一个副本,这里就是一个对象引用。

2.raiseSalary方法应用于这个对象引用。 x 和 harry 同时引用的那个 Employee 对象的工资 提高了200%。

3.方法结束后,参数变量x 不再使用。当然,对象变量 harry继续引用那个工资增至3倍 的员工对象(如图4-7所示)。

可以看到,实现一个改变对象参数状态的方法是完全可以的,实际上也相当常见。理由 很简单,方法得到的是对象引用的副本,原来的对象引用和这个副本都引用同一个对象。

很多程序设计语言(特别是C++ 和 Pascal) 提供了两种参数传递的方式:按值调用和按 引用调用。有些程序员(甚至有些书的作者)认为Java程序设计语言对对象采用的是按引用 调用,实际上,这种理解是不对的。由于这种误解具有一定的普遍性,所以很有必要给出一 个反例来详细地说明一下这个问题。

首先,编写一个交换两个 Employee对象的方法:public static void swap(Employee x, Employee y)// doesn't work

Employee temp = x;

x =y;

y =temp;

}

如果Java对对象采用的是按引用调用,那么这个方法就应该能够实现交换:

var a = new Employee("Alice",...);

var b = new Employee("Bob",...);

swap(a, b);

// does a now refer to Bob, b to Alice?

但是,这个方法并没有改变存储在变量a 和 b 中的对象引用。 swap方法的参数x 和 y 被初

始化为两个对象引用的副本,这个方法交换的是这两个副本。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 [email protected] 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.8.5 多重选择: switch语句
下一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_4.3.2 多个源文件的使用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×