方法重写(overriding)是一种面向对象编程机制,子类提供对在其超类中已定义的方法的自定义实现。子类中的方法必须具有相同的名称、参数和返回值类型(或其子类型)。
关键规则:
@Override注解可以在编译阶段帮助发现错误。示例:
class Animal { public void sound() { System.out.println("Some sound"); } } class Dog extends Animal { @Override public void sound() { System.out.println("Woof"); } }
问题: "可以在Java中重写静态方法吗?"
答案: 不可以,静态方法不能被重写。它们是隐藏的(method hiding)。如果在子类中声明一个具有相同签名的静态方法,将会发生隐藏,而不是重写。
示例:
class A { static void print() { System.out.println("A"); } } class B extends A { static void print() { System.out.println("B"); } } A obj = new B(); obj.print(); // 会打印 "A"
故事
在一个项目中,其中一位开发者试图在继承类中"重写"静态方法,期望通过超类的引用调用子类的版本。这导致了意外的结果:调用了超类的方法,因此程序工作不正确。
故事
重要的是使用
@Override注解。在一个项目中,开发者在重写时方法名称出现错误,且未使用注解,编译器没有报错。结果根据继承方案调用了基类的方法(默认),导致业务流程中的不正确逻辑。
故事
覆盖checked异常:开发者在重写的方法中添加了新的unchecked异常,该异常在原始签名中未定义。代码编译时出错,必须更改架构,因为这违反了重写异常的规则。