5.1 方法、参数与返回值
函数(function)是一段可重复使用的代码,用来完成一个明确任务。在 Java 中,函数写在类里面,通常称为方法(method)。你已经使用过很多库方法,例如 System.out.println()、input.nextInt()、Math.sqrt()。现在我们开始学习如何定义自己的方法。
定义方法
Java 方法需要写出返回值类型、方法名、参数列表和方法体。括号里的 num1、num2 是参数(parameter),调用时传进去的 4、12 这类具体值叫实参(argument)。
public class MethodDemo {
static int larger(int num1, int num2) {
if (num1 > num2) {
return num1;
} else {
return num2;
}
}
public static void main(String[] args) {
System.out.println(larger(4, 12));
System.out.println(larger(54, 33));
}
}运行结果:
12
54return 的作用是把结果交回给调用者(caller)。方法执行到 return 后,本次方法调用就结束了。
没有返回值的方法
有些方法只负责执行动作,不需要返回结果。这类方法的返回类型写成 void。
static void printBoard() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
System.out.print(" |");
}
System.out.println();
if (i < 2) {
System.out.println("---+---+---");
}
}
}运行结果:
| |
---+---+---
| |
---+---+---
| |void 方法没有有意义的返回值,可以用单独的 return; 提前结束,或者直接执行到末尾。
方法调用
方法调用(method call)发生时,程序会暂时离开当前位置,进入被调用方法的方法体(method body)内部执行。方法结束后,程序再回到原来的位置继续执行。这个“进入与返回”的过程可以用调用栈(call stack)理解。
下面的程序用方法拆分“两点间距离”的计算。
public class DistanceDemo {
static double square(double x) {
return x * x;
}
static double distance(double x1, double y1, double x2, double y2) {
return Math.sqrt(square(x1 - x2) + square(y1 - y2));
}
public static void main(String[] args) {
System.out.printf("距离:%.1f%n", distance(0, 0, 3, 4));
}
}运行结果:
距离:5.0Math.sqrt() 是 Java Math 类中的库方法。
参数与按值传递
参数(parameter)让方法变得灵活:相同方法接收不同实参,就能得到不同结果。Java 按值传递(pass by value)。对于 int、double 这样的基本类型,调用时实参的值会复制一份给形参,方法内部修改形参不会影响调用者的变量。
static int squareValue(int n) {
n = n * n; // 只改变副本
return n;
}
public static void main(String[] args) {
int x = 5;
int y = squareValue(x); // x 仍然是 5,y 是 25
System.out.println(x + " " + y);
}方法可以接收多个参数,但 return 只能返回一个值。把计算拆成带返回值的小方法,可以让 main 更简洁,每一步也更容易单独测试。
main 方法
Java 程序通常从 public static void main(String[] args) 开始执行,它是程序的入口(entry point)。运行类时,JVM 会调用这个方法。
public static void main(String[] args) {
System.out.println("程序开始");
}