Menu
CoddyTech

方法重载基础

本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 28 课,共 87 课。

多态的意思是“多种形式”。在 Java 中,多态可以让对象根据上下文表现出不同的行为。多态的一种形式是方法重载,也称为编译时多态,因为 Java 会在编译期间确定要调用哪个方法。

方法重载可以让你定义多个名称相同但参数不同的方法。编译器会根据参数的数量、类型或顺序来区分它们:

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

调用 add(5, 3) 时,Java 会使用第一个方法。调用 add(5, 3, 2) 会触发第二个方法,而 add(5.0, 3.0) 会调用第三个方法。编译器会根据你提供的参数选择合适的版本。

请注意,只更改返回类型不属于有效的重载。参数列表必须不同:

// 这不是有效的重载,无法编译
public int getValue() { return 1; }
public double getValue() { return 1.0; }  // 错误!

你之前其实已经见过重载,也就是构造函数重载。方法重载遵循相同的规则,通过让同一个方法名处理不同的输入情况来提供灵活性。

challenge icon

挑战

简单

让我们构建一个消息格式化器,通过提供多种格式化消息的方式来演示方法重载。你将创建一个工具类,其中包含多个重载的 format 方法,用于处理不同的输入情况。

你需要将代码分布在两个文件中:

  • MessageFormatter.java:创建一个类,通过重载方法灵活地格式化消息。你的格式化器应包含:
    • 一个方法 format(String message),返回用方括号括起来的消息:[message]
    • 一个方法 format(String message, int repeatCount),返回按指定次数重复的消息,各次重复之间用空格分隔
    • 一个方法 format(String message, String prefix),返回添加了前缀的消息:prefix: message
    • 一个方法 format(String message, String prefix, String suffix),返回:prefix: message (suffix)
    编译器会根据你传入的参数选择正确的方法,这就是编译时多态的实际应用!
  • Main.java:演示四个重载方法如何协同工作。你会收到四个输入:一条消息(String)、重复次数(int)、一个前缀(String)和一个后缀(String)。创建一个 MessageFormatter,并调用每个版本的 format 方法,将每个结果分别打印在单独一行:
    • 首先,只使用消息进行格式化
    • 其次,使用消息和重复次数进行格式化
    • 第三,使用消息和前缀进行格式化
    • 第四,使用消息、前缀和后缀进行格式化

你会收到四个输入:消息文本、重复次数、一个前缀字符串和一个后缀字符串。

例如,如果消息是 "Hello",重复次数是 3,前缀是 "INFO",后缀是 "done",你的输出应显示同一条消息经过四种不同方式格式化后的结果,每种方式都使用不同的重载方法!

亲手试试

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取输入
        String message = scanner.nextLine();
        int repeatCount = Integer.parseInt(scanner.nextLine());
        String prefix = scanner.nextLine();
        String suffix = scanner.nextLine();
        
        // TODO: 创建一个 MessageFormatter 对象
        
        // TODO: 只用 message 调用 format,并打印结果
        
        // TODO: 用 message 和 repeatCount 调用 format,并打印结果
        
        // TODO: 用 message 和 prefix 调用 format,并打印结果
        
        // TODO: 用 message、prefix 和 suffix 调用 format,并打印结果
        
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Java 在线编译器