第 6 章 · 方法

6.1 面向过程程序设计

把问题拆解为若干子步骤,用方法(函数)组织代码,实现复用与模块化。Java 中方法必须定义在类内部。

6.2 方法定义与调用

修饰符 返回类型 方法名(参数列表) {
    // 方法体
    return 返回值;   // void 可省略
}

public static int max(int a, int b) {
    return a > b ? a : b;
}

int m = max(3, 5);   // 调用
  • 方法签名由方法名 + 参数列表决定。
  • 重载:方法名相同、参数列表不同(个数/类型/顺序),与返回值无关。

6.3 参数值的传递

Java 只有按值传递,没有按引用传递:

  • 基本类型:传的是值的副本,方法内修改不影响实参。
  • 引用类型:传的是引用的副本,方法内可修改对象内容,但重新赋值(指向新对象)不影响实参。
void change(int[] arr) { arr[0] = 99; }  // 内容被改,因为 arr 指向同一对象

对比:C++ 有引用参数(int&)真正按引用传递;Python 传的是“对象引用”,可变对象(list)表现为按引用,不可变对象(int/str)表现为按值。Java 处于中间:始终按值,但引用类型可通过引用改内容。

6.4 方法的嵌套调用与递归

方法可调用其他方法,也可调用自身(递归)。递归必须有终止条件:

int fib(int n) {
    return n <= 1 ? n : fib(n - 1) + fib(n - 2);
}

6.5 变量的作用域

  • 局部变量:方法内声明,从声明处到块结束有效,必须先初始化再用。
  • 成员变量:类内方法外声明,有默认值,作用域是整个类。
  • 就近原则:局部变量与成员变量同名时,局部优先(用 this 可显式指代成员)。

6.6 与其他语言对比

  • C/C++:函数可定义在类外(自由函数),Java 强制方法属于类;C++ 支持默认参数、运算符重载,Java 靠重载实现类似效果。
  • Python:无重载(同名覆盖),靠默认参数和 *args/**kwargs 变通;Java 用重载 + 变长参数 int... nums