4.5 形参和实参

前面使用的有些方法需要实参,实参是调用方法时提供的值。例如,要计算一个数字的正弦就必须提供这个数字,因此,sin 接受一个 double 实参。要显示一条消息就必须提供这条消息,因此,println 接受一个 String 实参。

在使用方法时提供的是实参,在编写方法时指定的是形参。形参列表指定了必须提供哪些实参,以下是一个示例:

  1. public class PrintTwice {
  2. public static void printTwice(String s) {
  3. System.out.println(s);
  4. System.out.println(s);
  5. }
  6. public static void main(String[] args) {
  7. printTwice("Don't make me say this twice!");
  8. }
  9. }

printTwice 包含了一个名为 s,类型为 String 的形参。调用 printTwice 时,必须提供一个类型为 String 的实参。

方法执行前,实参会赋给形参。在这个示例中,实参 "Don't make me say this twice!" 被赋给形参 s

这个过程被称为参数传递(parameter passing),因为值从方法外传到了方法内。实参可以是任何表达式,因此,如果声明了一个 String 变量,就可将其用作实参:

  1. String argument = "Never say never.";
  2. printTwice(argument);

用作实参的值必须与形参的类型相同,例如,如果你试图像下面这样做:

  1. printTwice(17); // 语法错误

将出现类似于下面这样的错误消息:

  1. File: Test.java [line: 10]
  2. Error: method printTwice in class Test cannot be applied
  3. to given types;
  4. required: java.lang.String
  5. found: int
  6. reason: actual argument int cannot be converted to
  7. java.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)。