重载
- 概念: 重载是在同一个类中,有多个同名的方法,但参数类型、数量或顺序不同。
- 目的: 提供多种方式调用同一名称的方法,以适应不同的场景。
- 应用: 当需要以统一的方式来处理不同类型的数据时,可以用重载。
重写
- 概念: 重写发生在继承关系中,子类重新定义父类的方法。
- 目的: 子类可以根据自己的需求,改变或扩展父类的行为。
- 应用: 当子类需要增加新的功能,或者改变父类方法的行为时,可以使用重写。
简单总结:
- 重载: 提供多种方法签名。目的是提高程序的多样性和健壮性,以适配不同场景使用时,使用重载进行扩展;
- 重写: 增强剂,在不修改原方法的基础上增强或改变行为。
生活例子:
- 想吃一碗面,给你提供了拉面、炒面、刀削面等选项,这是重载。
- 不仅端来了面条,还加了青菜、鸡蛋等配料,这是重写。
设计模式:
- Cglib实现动态代理的核心原理就是方法的重写。
详细解答:
- 重载的应用场景: 构造器的重载是最常见的应用场景之一,比如Spring框架中的
ClassPathXmlApplicationContext
类,其构造函数使用重载提供了多种初始化方式。 - 重写的应用场景: 子类可以通过重写父类的方法来扩展或修改父类的功能,比如Cglib动态代理中,代理类会重写目标类的方法。
总结:
- 重载必须修改方法的形参列表,返回值类型不能修改,访问权限也不能更严格。
- 重写只能用于子类对父类方法的扩展或修改,不能抛出比父类方法声明的异常更多的异常。
里氏替换原则:
- 子类应尽可能不要重写和重载父类的方法,除非必要。