讲解

方法(method)是把一段逻辑打包命名、随取随用的机制——它相当于其他语言里的「函数」,只是 Java 里所有方法都必须属于某个类。定义一个方法的完整骨架是:修饰符 返回类型 方法名(参数列表) { 方法体 },例如 public static int add(int a, int b) { return a + b; }。返回类型声明这个方法算出来的结果是什么类型,不需要返回值就写 void;return 语句既交回结果,也立即结束方法。

调用方法就是把任务派出去再收回结果:int sum = add(3, 4);。传参时要理解 Java 的「按值传递」:基本类型传的是值的副本,方法里改参数不会影响外面的变量;引用类型传的是地址的副本,方法里可以通过这个地址修改对象内部,但没法让外面的变量改指向另一个对象。一个经典实验是写个方法试图交换两个 int——它永远成功不了,因为方法拿到的只是两个副本。

方法重载(overload)允许同名方法共存,只要参数列表不同(个数或类型不同):add(int, int)、add(double, double)、add(int, int, int) 是三个合法的重载,调用时编译器按实参类型自动选一个。注意「返回值不同」不算重载依据,只改返回值会编译报错。重载让调用者用同一个名字处理不同类型,System.out.println 能打印一切就是靠重载。方法的设计原则:一个方法只做一件事,名字说清这件事,超过一屏就该考虑拆分。

示例

定义并调用带参数、带返回值的方法:

public class Main {
    public static int add(int a, int b) {
        return a + b;
    }

    public static double average(int a, int b, int c) {
        return (a + b + c) / 3.0;
    }

    public static void greet(String name) {
        System.out.println("你好," + name + "!");
    }

    public static void main(String[] args) {
        System.out.println("3 + 4 = " + add(3, 4));
        System.out.println("平均分:" + average(80, 90, 100));
        greet("李明");
    }
}

重载:同一个方法名,按参数类型自动分派:

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

    public static int max(int a, int b, int c) {
        return max(max(a, b), c);
    }

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

    public static void main(String[] args) {
        System.out.println(max(3, 7));
        System.out.println(max(3, 7, 5));
        System.out.println(max(2.5, 1.8));
    }
}

按值传递实验:基本类型的交换不会成功,数组(引用类型)的内容却能被改掉:

import java.util.Arrays;

public class Main {
    public static void trySwap(int a, int b) {
        int t = a;
        a = b;
        b = t;
    }

    public static void fillTen(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] = 10;
        }
    }

    public static void main(String[] args) {
        int x = 1, y = 2;
        trySwap(x, y);
        System.out.println("交换后 x=" + x + ", y=" + y + "(没变)");

        int[] nums = {1, 2, 3};
        fillTen(nums);
        System.out.println("数组内容:" + Arrays.toString(nums) + "(变了)");
    }
}

常见坑

  • 以为方法能改掉基本类型实参:参数是副本,swap 两个 int 注定失败。要带回多个结果,得把值包进数组或对象,或者改用返回值。
  • 忘了 return 或漏了分支:非 void 方法的每条执行路径都必须有 return,编译器会严格检查;if 里 return 了而 else 没写就编译不过。
  • 靠返回值区分重载:void log(String s) 和 int log(String s) 不能共存——调用处光看参数分不出该用哪个。重载只认参数列表。
  • 一个方法写几百行:方法越长越难测难改。发现自己在写注释「下面这段做另一件事」时,就是该拆方法的信号。

小结

方法 = 修饰符 + 返回类型 + 名称 + 参数 + 方法体;Java 按值传递,重载只看参数列表。下一节进入 Java 的核心世界观:类与对象。