Learn
Java/04-methods

方法

方法(method)是 Java 中组织代码的基本单位。

1. 基本定义

[修饰符] 返回值类型 方法名(参数列表) {
    方法体
    return 返回值;
}
基本方法
public class Main {
    // 静态方法
    static int add(int a, int b) {
        return a + b;
    }
 
    public static void main(String[] args) {
        System.out.println(add(3, 5));
        System.out.println(add(10, 20));
    }
}

2. 参数传递

Java 中基本类型按值传递,引用类型按引用传递(传递的是引用的副本)。

值传递 vs 引用传递
public class Main {
    static void bump(int n) { n++; }                          // 改不动外面
    static void append(java.util.List<String> list) {
        list.add("added");                                    // 能改 list 内容
    }
 
    public static void main(String[] args) {
        int x = 10;
        bump(x);
        System.out.println("x = " + x);   // 10
 
        var list = new java.util.ArrayList<String>(java.util.List.of("a", "b"));
        append(list);
        System.out.println("list = " + list);  // [a, b, added]
    }
}
ℹ️Java 没有引用传递的引用

Java 始终是值传递:对于引用类型,传的是引用的副本。但因为副本和原引用指向同一对象,所以能修改对象内容。重新赋值 list = newList 不会影响外面。

3. 方法重载

同名方法、不同参数(数量或类型),构成重载。

方法重载
public class Main {
    static int add(int a, int b)            { return a + b; }
    static double add(double a, double b)   { return a + b; }
    static String add(String a, String b)   { return a + b; }
 
    public static void main(String[] args) {
        System.out.println(add(1, 2));
        System.out.println(add(1.5, 2.5));
        System.out.println(add("Hello, ", "Java"));
    }
}

4. 可变参数 varargs

可变参数
public class Main {
    static int sum(int... nums) {
        int s = 0;
        for (int n : nums) s += n;
        return s;
    }
 
    public static void main(String[] args) {
        System.out.println(sum());              // 0
        System.out.println(sum(1, 2, 3));       // 6
        System.out.println(sum(new int[]{1, 2, 3, 4, 5}));  // 15
    }
}
💡varargs 的本质

int... nums 等价于 int[] nums。调用时编译器会构造一个数组。只能有一个 varargs 参数,且必须是最后一个。

5. 静态工具方法集合

工具方法
public class Main {
    static int max(int a, int b) { return a > b ? a : b; }
    static int max(int a, int b, int c) { return max(max(a, b), c); }
    static double avg(int... nums) {
        if (nums.length == 0) return 0;
        long s = 0;
        for (int n : nums) s += n;
        return (double) s / nums.length;
    }
 
    public static void main(String[] args) {
        System.out.println(max(3, 7));
        System.out.println(max(3, 7, 2));
        System.out.println(avg(1, 2, 3, 4, 5));
    }
}

6. 递归

递归阶乘
public class Main {
    static long fact(int n) {
        if (n <= 1) return 1;
        return n * fact(n - 1);
    }
 
    public static void main(String[] args) {
        for (int i = 0; i <= 6; i++) {
            System.out.println(i + "! = " + fact(i));
        }
    }
}

🎯 练习

判断素数
// 任务:写 isPrime(n),返回 n 是否为素数
// 期望:isPrime(17)=true, isPrime(18)=false
 
public class Main {
    static boolean isPrime(int n) {
        // 补全代码
        return false;
    }
 
    public static void main(String[] args) {
        System.out.println("17 -> " + isPrime(17));
        System.out.println("18 -> " + isPrime(18));
        System.out.println("2  -> " + isPrime(2));
    }
}

小结

  • ✅ static 返回值类型 方法名(参数) 定义方法
  • ✅ 基本类型按值传递;引用类型传引用的副本
  • ✅ 方法重载:同名不同参
  • ✅ T... args 可变参数(最多一个,必须在末尾)
  • ✅ 递归必须有终止条件

下一章 面向对象基础。