Java学习123——方法的重载(Overloading)和重写(Overriding)
在Java中,方法的重载(Overloading)和重写(Overriding)是面向对象编程中的两个重要概念,它们分别体现了编译时多态和运行时多态的特性。以下是两者的详细对比:
方法重载(Overloading)
- 定义
在同一个类中,允许存在多个同名方法,但这些方法的参数列表必须不同(类型、数量或顺序不同)。 - 关键点
- 参数列表必须不同:仅返回值不同无法构成重载。
- 访问修饰符和返回类型:可以不同,不影响重载。
- 作用范围:发生在同一个类或父子类之间(子类可以重载父类方法)。
- 编译时多态:编译器根据调用时的参数决定具体调用哪个方法。
示例
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
方法重写(Overriding)
- 定义
子类重新定义父类中已有的方法,方法名、参数列表和返回类型必须相同(返回类型支持协变)。 - 关键点
方法签名一致:方法名、参数列表和返回类型(允许子类返回更具体的类型)必须相同。
访问权限:不能比父类更严格(例如父类为 public,子类不能为 private)。
异常限制:不能抛出比父类更宽泛的检查型异常。
运行时多态:通过对象实际类型决定调用哪个方法。
限制条件:不能重写 final、static 或 private 方法。
示例
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
核心区别
特性 | 重载(Overloading) | 重写(Overriding) |
作用范围 | 同一个类或父子类 | 子类与父类之间 |
参数列表 | 必须不同 | 必须相同 |
返回类型 | 可以不同 | 必须相同(支持协变返回类型) |
异常处理 | 无限制 | 不能抛出更宽泛的检查型异常 |
访问修饰符 | 无限制 | 不能比父类更严格 |
多态性 | 编译时多态(静态绑定) | 运行时多态(动态绑定) |
方法类型 | 实例方法、静态方法均可 | 仅实例方法(静态方法为隐藏,非重写) |
注意事项
- 重载中的自动类型转换
若参数类型不精确匹配,编译器会尝试自动类型提升(如 int 转 double)。 - 协变返回类型
子类重写方法的返回类型可以是父类方法返回类型的子类(例如父类返回 Object,子类返回 String)。 - 静态方法隐藏
若子类定义与父类相同的静态方法,父类方法会被隐藏,调用时由引用类型决定。 - 私有方法不可重写
私有方法在子类中不可见,因此同名方法视为新方法,而非重写。
通过理解重载和重写的机制,可以更灵活地设计类的层次结构和方法调用逻辑,充分利用Java的多态特性。
相关文章
- Serverless时代,Java如何放下身段拥抱轻量化,实现毫秒级唤醒?
- Java学习123——方法的重载(Overloading)和重写(Overriding)
- SpringBoot + Apache tika 轻松实现各种文档内容解析
- 紧急修复XML漏洞,WordPress 3.9.2 下载
- 安全研究员曝光FireEye核心产品0day漏洞
- Linux并发IO详解(上)
- Nginx核心参数 try_files使用及原理
- Nginx性能调优与优化指南
- 深入对比Nginx、LVS和HAProxy,选择最合适负载均衡方案!
- Nginx的http块sendfile,keepalive_timeout的配置指令说明,