Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 3.3 方法重载与重写

3.3 方法重载与重写

方法重载(Overloading)

定义

方法重载是指在同一个类中,允许存在多个同名方法,但这些方法的参数列表必须不同(参数类型、参数个数或参数顺序不同)。方法重载与返回值类型无关。

特点

  • 相同的方法名:重载的方法名称必须相同。
  • 不同的参数列表:参数的类型、数量或顺序必须不同。
  • 与返回值无关:返回值类型可以相同也可以不同。
  • 发生在同一个类中:重载方法必须在同一个类中定义。

示例代码

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;
    }
}

应用场景

  • 提供多种参数组合的相同功能方法。
  • 提高代码的可读性和灵活性。

方法重写(Overriding)

定义

方法重写是指子类重新定义父类中已有的方法。重写的方法必须具有相同的方法名、参数列表和返回类型(或子类返回类型)。

特点

  • 相同的方法签名:方法名、参数列表和返回类型必须与父类方法一致。
  • 访问权限不能更低:子类方法的访问权限不能比父类方法更严格(例如,父类方法是protected,子类方法可以是public或protected,但不能是private)。
  • 发生在继承关系中:重写方法必须在子类中定义。
  • 不能重写final或static方法:final方法不能被重写,static方法属于类而非实例,因此也不涉及重写。

示例代码

class Animal {
    public void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }
}

@Override注解

  • 用于显式标记方法重写,帮助编译器检查方法签名是否正确。
  • 如果方法签名与父类不匹配,编译器会报错。

应用场景

  • 子类需要修改或扩展父类的行为。
  • 实现多态性(通过父类引用调用子类方法)。

方法重载与重写的区别

特性方法重载(Overloading)方法重写(Overriding)
定义位置同一个类中子类中
方法签名必须不同(参数类型、数量或顺序)必须相同
返回值类型可以不同必须相同(或子类返回类型)
访问权限无限制子类方法不能更严格
作用提供多种参数组合的相同功能修改或扩展父类行为

常见问题与注意事项

  1. 重载与返回类型无关:仅通过返回类型不同无法实现重载。

    // 错误示例:编译报错
    public int calculate(int a, int b) { return a + b; }
    public double calculate(int a, int b) { return a + b; }
    
  2. 重写时子类方法不能抛出更宽泛的异常:子类方法抛出的异常不能比父类方法更宽泛(例如,父类抛出IOException,子类不能抛出Exception)。

  3. 静态方法不能被重写:静态方法属于类,子类可以定义同名静态方法,但这是隐藏(Hiding)而非重写。

  4. 构造方法不能重写:构造方法不是继承的,因此不存在重写。


总结

  • 方法重载:通过不同参数列表实现同名方法,增强代码灵活性。
  • 方法重写:子类重新定义父类方法,实现多态性。
  • 两者是面向对象编程中实现代码复用和多态的重要机制。
Last Updated:: 3/27/25, 12:48 PM