方法重写(Override)是面向对象编程中的一个重要概念,特别是在使用如Java、C#等支持继承的语言时。它指的是子类可以提供一个特定签名的方法,这个方法在父类中已经被定义(即子类的方法和父类中的某个方法在方法名、返回类型以及参数列表上完全相同,但实现细节可以不同)。当子类对象被当作父类对象使用时,如果通过父类引用调用了一个被子类重写的方法,那么实际上会执行子类中的那个方法实现,而不是父类中的实现。
方法重写必须遵循以下几个规则:
-
方法名、参数列表必须相同:这是区分方法重写和方法重载的关键。方法重载是同一个类中方法名相同但参数列表不同(参数类型、参数个数或参数顺序不同)的多个方法。
-
返回类型可以相同也可以是子类型:在Java中,子类重写的方法的返回类型可以与父类中被重写的方法的返回类型相同,或者是其子类。但从Java 5开始,协变返回类型(Covariant Return Types)允许子类重写的方法有更为具体的返回类型。
-
访问权限不能比父类中被重写的方法的访问权限更低:例如,如果父类中的方法是public的,那么子类中重写的方法也必须是public的。
-
子类重写的方法不能抛出比父类中被重写的方法更多的检查型异常:但是,子类重写的方法可以抛出运行时异常(RuntimeException)及其子类,因为运行时异常在编译时不被检查。
-
被static、final、private修饰的方法不能被重写:static方法是属于类的,不是属于对象的,因此不存在多态;final方法不允许被任何子类修改;private方法只能在其所在的类内部被访问,子类无法访问到,因此也不能被重写。
方法重写是实现多态性的基础之一,它允许程序在运行时根据对象的实际类型来决定调用哪个方法,而不是在编译时决定。这种特性增强了程序的灵活性和可扩展性。