
4.5 参数传值

在Java 应用程序中,如果在声明方法时包含了形参声明,则在调用方法时必须给这些形参指定参数值。在调用方法时,实际传递给形参的参数值被称为实参。
4.5.1 传值机制
Java 方法中的参数传递方式只有一种,即值传递。所谓的值传递,是将实际参数的副本传递到方法内,而参数本身不会受到任何影响。例如,用户去银行开户需要身份证原件和复印件,而身份证原件和复印件上的内容完全相同。当复印件上的内容改变时,原件上的内容不会受到任何影响。也就是说,方法中参数变量的值是调用者指定值的拷贝。
4.5.2 基本数据类型的参数传值
对于基本数据类型的参数,向该参数传递值的级别不能高于该参数的级别。例如,不可以向int 型参数传递一个float 值,但可以向double 型参数传递一个float 值。
【例4.4】 在Point 类中定义一个add() 方法,然后在Example 类的main() 方法中创建Point 类的对象,然后调用该对象的add(int x,int y) 方法,当调用add() 方法时,必须向add() 方法中传递两个参数。Point 类的具体代码如下:

Example 类的具体代码如下:

4.5.3 引用类型参数的传值
当参数是引用类型时,传递的值是变量中存放的 “引用”,而不是变量所引用的实体。两个相同类型的引用型变量,如果具有同样的引用,则会具有同样的实体,因此,如果该参数表示变量所引用的实体,则会导致原变量的实体发生同样的变化;然而,改变参数中存放的 “引用” 不会影响向其传值的变量中存放的 “引用”。
【例4.5】 Car 类为汽车类,负责创建一个汽车类的对象,FuelTank 类是一个油箱类,负责创建油箱的对象。Car 类创建的对象在调用run(FuelTank ft) 方法时需要将FuelTank 类创建的油箱对象ft 传递给run(FuelTank ft) 方法。该方法会消耗汽油,油箱中的汽油会减少。
FuelTank 类的具体代码如下:

Car 类的具体代码如下:


测试类Example2 的具体代码如下:

程序运行结果如图4.9 所示。

图4.9 汽车消耗油量的计算结果