编程Java开发者

Java中的方法重写机制是如何工作的,如何正确使用它以及需要考虑哪些细节?

用 Hintsage AI 助手通过面试

答案。

方法重写(overriding)是一种面向对象编程机制,子类提供对在其超类中已定义的方法的自定义实现。子类中的方法必须具有相同的名称、参数和返回值类型(或其子类型)。

关键规则:

  • 方法必须是public或protected(不能更严格的访问级别)。
  • 您不能重写private和static方法。
  • 使用@Override注解可以在编译阶段帮助发现错误。
  • 在Java中支持协变返回类型(重写的方法可以返回原始返回类型的子类型)。
  • 异常:子类中的方法不能声明在基本方法的签名中不存在的新checked异常。

示例:

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异常,该异常在原始签名中未定义。代码编译时出错,必须更改架构,因为这违反了重写异常的规则。