4.5 形参和实参
前面使用的有些方法需要实参,实参是调用方法时提供的值。例如,要计算一个数字的正弦就必须提供这个数字,因此,sin 接受一个 double 实参。要显示一条消息就必须提供这条消息,因此,println 接受一个 String 实参。
在使用方法时提供的是实参,在编写方法时指定的是形参。形参列表指定了必须提供哪些实参,以下是一个示例:
public class PrintTwice {public static void printTwice(String s) {System.out.println(s);System.out.println(s);}public static void main(String[] args) {printTwice("Don't make me say this twice!");}}
printTwice 包含了一个名为 s,类型为 String 的形参。调用 printTwice 时,必须提供一个类型为 String 的实参。
方法执行前,实参会赋给形参。在这个示例中,实参 "Don't make me say this twice!" 被赋给形参 s。
这个过程被称为参数传递(parameter passing),因为值从方法外传到了方法内。实参可以是任何表达式,因此,如果声明了一个 String 变量,就可将其用作实参:
String argument = "Never say never.";printTwice(argument);
用作实参的值必须与形参的类型相同,例如,如果你试图像下面这样做:
printTwice(17); // 语法错误
将出现类似于下面这样的错误消息:
File: Test.java [line: 10]Error: method printTwice in class Test cannot be appliedto given types;required: java.lang.Stringfound: intreason: actual argument int cannot be converted tojava.lang.String by method invocation conversion
在有些情况下,Java 能够自动将实参从一种类型转换为另一种类型。例如,Math.sqrt 需要接受一个 double 实参,但如果你调用了 Math.sqrt(25),整数值 25 将自动转换为浮点值 25.0。但就 printTwice 而言,Java 并不能(或不会)将提供给它的整数 17 转换为 String。
形参和其他变量只存在于当前的方法中;在 main 中,没有 s 这样的变量,如果试图在这个方法中使用它,将导致编译错误。同样,printTwice 中没有 args 变量,这个变量位于 main 中。
鉴于变量只在定义它的方法中存在,因此它们常被称为局部变量(local varible)。
