11-方法

nobility 发布于 2025-07-14 01-Java语言基础 800 次阅读


方法

什么是方法

方法是执行特定功能的一段代码集合,相当于其他语言中的函数或子程序。通过方法将代码组织成一个个可重用的单元,提高程序的结构性和可维护性。Java 中的方法必须定义在类中,且不能在方法内部嵌套定义其他方法。

方法的定义

[访问修饰符] [static] 返回值类型 方法名([参数列表]) {
    // 方法体
    [return 返回值;]
}
  • 修饰符:可选,指定方法的访问权限,如 publicprivateprotected 等。
  • 返回值类型:指定方法执行后返回的数据类型,可以是任何数据类型,但是必须与方法体中 return 语句所返回的类型匹配,如果无返回值,则可以使用 void
  • 方法名:遵循 Java 标识符命名规则,通常使用小驼峰命名法。
  • 参数列表:调用方法时传递给方法的参数,格式为 参数类型 参数名,多个参数用逗号隔开,无参数时写成空括号 ()

方法的调用

// 无参方法调用
方法名();
对象.方法名();

// 带参方法调用
方法名(实参列表);
对象.方法名(实参列表);

// 静态方法调用
类名.方法名();

方法重载 (Overloading)

在同一个类中,允许存在多个同名方法,只要它们的参数列表不同(参数类型、个数或顺序不同)。

📝 注意:

  1. 只要方法的参数类型、个数、顺序不同,方法就可以重载。
  2. 方法返回值类型、异常类型声明、访问修饰符均不影响重载。
  3. 构造方法也可以重载。

示例

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
    
    public double add(double a, double b) {
        return a + b;
    }
    
    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

可变参数 (Varargs)

Java 允许方法接受一个可变数量的参数,使用 ... 表示。

📝 注意:

  1. 一个方法‌只能有一个可变参数‌,多个可变参数会引发歧义。
  2. 可变参数必须作为方法的‌最后一个参数‌,否则会导致编译错误。
  3. 可变参数本质上是数组,所以可直接传递数组。
  4. 频繁调用可变参数方法可能影响性能,因为需要隐式的创建数组。
  5. 当固定参数方法与可变参数方法同时存在时,‌固定参数方法会被优先调用‌。
  6. 两个可变参数方法重载时,对于空参数的调用会引发歧义,所以会导致编译错误。

示例

public int sum(int... numbers) {
    int total = 0;
    for (int num : numbers) {
        total += num;
    }
    return total;
}

递归方法(Recursive)

方法可以递归的调用自身。

📝 注意:

  1. 递归必须包含‌可触达的终止条件‌,否则会无限递归直至栈溢出‌。
  2. 每次递归调用必须‌缩小问题规模‌,从而可以确保向终止条件逼近‌。
  3. 递归调用栈的‌空间复杂度为 O(n)O(n)‌

示例

public int factorial(int n) {
    if (n == 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

形参与实参

  • 形参:是方法定义时指定的变量,用作占位符。
  • 实参:是在调用方法时传入的具体数据,其数量、类型和顺序必须与形参一致。

示例

public int add(int x, int y) {
    // x 和 y 是形参
    return x + y;
}
// 10 和 20 是实参
int result = add(10, 20);

地址传递和值传递

  • 值传递(基本数据类型):基本类型传递的是值的副本‌,方法内修改不影响原始变量。
  • 地址传递的本质(引用数据类型):引用类型传递‌的是地址值的副本‌,方法那可以修改对象的属性,但重新赋值引用无效。

示例

public class Dome {  
    static void changeNum(int num) {  
        // 修改副本,不影响原始值  
        num = 100;  
    }  
  
    static void changeName(Person p) {  
        // 修改对象属性(影响原始对象)  
        p.name = "Bob";  
        // 重新赋值引用(不影响原始引用)  
        p = new Person();  
    }  
  
    public static void main(String[] args) {  
        int a = 10;  
        // 基本类型(值副本传递)  
        changeNum(a);  
        // 依旧输出 10
        System.out.println(a);  
  
        Person person = new Person("Alice");  
        // 引用类型(地址值副本传递)  
        changeName(person);  
        // 会输出 "Bob",因为 name 被修改  
        System.out.println(person.name);  
    }  
}

最佳实践

  1. 避免过长的方法。
  2. 方法应该只做一件事。
  3. 方法名应该能准确的描述其功能。
  4. 适当的使用注释说明复杂逻辑。
  5. 合理使用访问修饰符来控制可见性。
加油啊!即便没有转生到异世界,也要拿出真本事!!!\(`Δ’)/
最后更新于 2025-07-14