第22章

Java方法

掌握方法的定义、调用、参数传递和重载技术

学习目标

方法基础概念

方法(Method)是Java中组织代码的基本单位,它将一组相关的语句封装在一起,实现特定的功能。方法提高了代码的复用性、可读性和可维护性,是面向对象编程的重要组成部分。

为什么需要方法?

  • 代码复用:避免重复编写相同的代码
  • 模块化:将复杂问题分解为简单的子问题
  • 易于维护:修改功能时只需修改对应方法
  • 提高可读性:通过方法名清晰表达代码意图

方法的基本语法

方法定义的完整语法:
[访问修饰符] [static] 返回值类型 方法名(参数列表) {
    // 方法体
    [return 返回值;]
}

无参无返回值方法

示例:
public void sayHello() {
    System.out.println("Hello, World!");
}
  • 不接收任何参数
  • 不返回任何值
  • 使用void关键字
  • 适合执行简单操作

有参无返回值方法

示例:
public void greet(String name) {
    System.out.println("Hello, " + name + "!");
}
  • 接收一个或多个参数
  • 不返回任何值
  • 参数用于传递数据
  • 增强方法的灵活性

无参有返回值方法

示例:
public int getCurrentYear() {
    return 2024;
}
  • 不接收任何参数
  • 返回特定类型的值
  • 必须使用return语句
  • 适合获取固定信息

有参有返回值方法

示例:
public int add(int a, int b) {
    return a + b;
}
  • 接收一个或多个参数
  • 返回特定类型的值
  • 最常用的方法类型
  • 实现数据处理功能

方法调用

定义方法后,需要通过方法调用来执行方法中的代码。Java中有两种主要的方法调用方式:静态方法调用和实例方法调用。

静态方法调用

静态方法定义和调用:
public class MathUtils {
    // 静态方法定义
    public static int multiply(int a, int b) {
        return a * b;
    }
    
    public static void main(String[] args) {
        // 静态方法调用
        int result = MathUtils.multiply(5, 3);
        System.out.println("结果: " + result);
    }
}

实例方法调用

实例方法定义和调用:
public class Calculator {
    // 实例方法定义
    public int subtract(int a, int b) {
        return a - b;
    }
    
    public static void main(String[] args) {
        // 创建对象
        Calculator calc = new Calculator();
        // 实例方法调用
        int result = calc.subtract(10, 4);
        System.out.println("结果: " + result);
    }
}
特性 静态方法 实例方法
关键字 static 无static关键字
调用方式 类名.方法名() 对象名.方法名()
内存分配 方法区 堆内存
访问实例变量 不能直接访问 可以访问
使用场景 工具方法、数学计算 对象行为、状态操作

参数传递机制

Java中的参数传递采用"值传递"机制,但对于不同类型的数据,传递的"值"有所不同。理解参数传递机制对于正确使用方法至关重要。

基本数据类型参数传递

基本类型参数传递示例:
public class ParameterDemo {
    public static void changeValue(int x) {
        x = 100;  // 只改变局部变量x的值
        System.out.println("方法内x的值: " + x);
    }
    
    public static void main(String[] args) {
        int num = 10;
        System.out.println("调用前num的值: " + num);
        changeValue(num);
        System.out.println("调用后num的值: " + num);
    }
}

基本类型参数传递特点

传递基本数据类型时,方法接收的是实参值的副本,方法内对参数的修改不会影响原始变量的值。

引用类型参数传递

引用类型参数传递示例:
public class ReferenceDemo {
    public static void changeArray(int[] arr) {
        arr[0] = 999;  // 修改数组元素
        System.out.println("方法内数组第一个元素: " + arr[0]);
    }
    
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        System.out.println("调用前数组第一个元素: " + numbers[0]);
        changeArray(numbers);
        System.out.println("调用后数组第一个元素: " + numbers[0]);
    }
}

引用类型参数传递特点

传递引用类型时,方法接收的是对象引用的副本,通过这个引用可以修改对象的内容,但不能改变原始引用指向的对象。

方法重载(Overloading)

方法重载是指在同一个类中定义多个同名方法,但这些方法的参数列表不同。方法重载提供了使用相同方法名处理不同类型或数量参数的能力。

重载的条件

方法重载必须满足以下条件之一:

  • 参数个数不同:方法的参数数量不一样
  • 参数类型不同:对应位置的参数类型不一样
  • 参数顺序不同:参数类型的顺序不一样

注意:仅仅返回值类型不同不能构成方法重载!

方法重载示例:
public class OverloadDemo {
    // 重载方法1:两个int参数
    public int add(int a, int b) {
        return a + b;
    }
    
    // 重载方法2:三个int参数
    public int add(int a, int b, int c) {
        return a + b + c;
    }
    
    // 重载方法3:两个double参数
    public double add(double a, double b) {
        return a + b;
    }
    
    // 重载方法4:一个int和一个double参数
    public double add(int a, double b) {
        return a + b;
    }
    
    // 重载方法5:一个double和一个int参数
    public double add(double a, int b) {
        return a + b;
    }
    
    public static void main(String[] args) {
        OverloadDemo demo = new OverloadDemo();
        
        System.out.println(demo.add(1, 2));           // 调用方法1
        System.out.println(demo.add(1, 2, 3));        // 调用方法2
        System.out.println(demo.add(1.5, 2.5));       // 调用方法3
        System.out.println(demo.add(1, 2.5));         // 调用方法4
        System.out.println(demo.add(1.5, 2));         // 调用方法5
    }
}

实战练习

通过在线IDE体验完整的Java方法示例,包括方法定义、调用、重载等核心概念的实际应用。

💻 查看完整代码 - 在线IDE体验

方法设计最佳实践

方法设计原则

推荐做法

  • 单一职责:每个方法只做一件事
  • 命名清晰:方法名要表达其功能
  • 参数合理:避免过多参数(建议不超过5个)
  • 返回值明确:返回值类型要与方法功能匹配
  • 异常处理:对可能的异常进行适当处理

避免做法

  • 方法过长:避免方法体超过50行
  • 功能混杂:一个方法做多件不相关的事
  • 命名模糊:使用a、b、c等无意义的方法名
  • 副作用:方法产生意外的副作用
  • 硬编码:在方法中使用魔法数字
良好的方法设计示例:
public class BankAccount {
    private double balance;
    
    /**
     * 存款方法
     * @param amount 存款金额,必须大于0
     * @return 存款后的余额
     */
    public double deposit(double amount) {
        if (amount <= 0) {
            throw new IllegalArgumentException("存款金额必须大于0");
        }
        balance += amount;
        return balance;
    }
    
    /**
     * 取款方法
     * @param amount 取款金额,必须大于0且不超过余额
     * @return 取款后的余额
     */
    public double withdraw(double amount) {
        if (amount <= 0) {
            throw new IllegalArgumentException("取款金额必须大于0");
        }
        if (amount > balance) {
            throw new IllegalArgumentException("余额不足");
        }
        balance -= amount;
        return balance;
    }
    
    /**
     * 获取当前余额
     * @return 当前账户余额
     */
    public double getBalance() {
        return balance;
    }
}

章节总结