当我们扩展一个类并实现父类的方法时,为什么要使用@override注解?如果我们不使用它会发生什么?即使程序编译了还需要吗?这些可能是一些与Java中是否使用@override注解相关的问题。
java中的@override是什么?
@override 注解是一个 java 注解,用于指示子类的方法正在重写其超类的方法。也就是说,它用于确保我们要重写的方法实际上存在于超类中。如果不存在,编译器将抛出错误。这是 @override 注解的一般定义,尽管我们将在下面看到更多细节。
我们的 animal 类有两个方法:sound 和 eat,这两种方法都通过控制台打印通用消息。我们可以创建一个实例来验证这些方法的行为。
public class animal { public void sound() { system.out.println("generic animal sound"); } public void eat() { system.out.println("generic animal eating"); } }
public static void main(string[] args) { animal animal = new animal(); animal.sound(); // generic animal sound animal.eat(); // generic animal eating }
接下来,我们有 cat 类,它扩展 animal 并重写这两个方法以打印来自猫的特定消息,考虑到 @override 注释未在任何方法中使用。
public class cat extends animal { public void sound() { system.out.println("meow meow"); } public void eat() { system.out.println("cat is eating"); } }
在 cat 类中,ide 本身会向我们显示一个警告,指示有必要在每个重写方法之前添加 @override 注释,到目前为止一切顺利,如果我们创建该类的实例并且调用方法,程序将编译并运行没有问题。
public static void main(string[] args) { animal animal = new cat(); animal.sound(); // meow meow animal.eat(); // cat is eating }
ide本身指示应该使用@override注解的原因是因为该注解允许我们验证我们要重写的方法是否确实存在于超类中并且是否被正确扩展。
例如,如果将 sound 方法更改为 sound,则没有任何警告我们超类方法没有被覆盖。考虑到这一点,如果我们再次运行前面的示例,将执行的声音方法将是 animal 超类的方法。
public class cat extends animal { public void soound() { system.out.println("meow meow"); } public void eat() { system.out.println("cat is eating"); } }
public static void main(string[] args) { animal animal = new cat(); animal.sound(); // generic animal sound animal.eat(); // cat is eating }
这是一个问题,因为代码的行为不符合预期,并且查找错误可能需要一些时间。另一方面,如果每个方法都有 @override 注解,这不会代表问题,因为编译器会自动抛出一个错误,表明我们要重写的方法在超类中不存在,并且 ide 本身会显示警告。
public class Cat extends Animal { @Override public void sound() { System.out.println("Meow meow"); } @Override public void eat() { System.out.println("Cat is eating"); } }
@override 的目的不仅是声明意图表达,还可以帮助在编译时检测错误并确保代码按预期运行,为程序员提供安全性和信心。因此,每当重写超类的方法时,最好使用注释,即使程序编译没有问题。