Android Studio中@override的含义

use*_*187 47 java android overriding annotations

我是Android Studio的新手,我想知道@OverrideAndroid Studio中语句的用途.

sna*_*ile 86

@Override是一个Java注释.它告诉编译器以下方法覆盖超类的方法.例如,假设您实现了Person类.

public class Person {
   public final String firstName;
   public final String lastName;

   //some methods

   @Override public boolean equals(Object other) {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

person类有一个equals()方法.equals方法已在Person的超类Object中定义.因此,equals()的上述实现是对Persons的equals()的重新定义.也就是说,Person覆盖equals().

在没有明确注释方法的情况下覆盖方法是合法的.那么@Override注释有什么用呢?如果您不小心尝试以这种方式覆盖equals(),该怎么办?

public boolean equals(Person other) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

上面的案例有一个错误.你的意思是重写equals(),但你没有.为什么?因为真正的equals()获取一个Object作为参数,你的equals()获取一个Person作为参数.编译器不会告诉您有关该错误的信息,因为编译器不知道您想要覆盖.就编译器而言,你实际上意味着重载 equals().但是如果你试图使用@Override注释覆盖equals:

@Override public boolean equals(Person other) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

现在编译器知道你有错误.你想覆盖,但你没有.因此,使用@Override注释的原因是显式声明方法覆盖.


Ber*_*t F 20

它是一个Java注释(不是特定于Android的).您可以使用它来表示此方法覆盖方法.

之所以用它是当你创建你打算重写的方法的方法来捕获错误,而是通过一些错误,但它不是,例如错字方法名,方法签名等.例如一个错误,有时候开发者会这样:

class Foo { 
    public boolean equals(Foo other) {
       ...
Run Code Online (Sandbox Code Playgroud)

作者希望这可以覆盖超类的equals方法,但它不会(参数类型应该是Object).该程序将编译正常,但不会Foo.equals按照作者的意图使用.

class Foo {
    @Override
    public boolean equals(Foo other) {
       ...
Run Code Online (Sandbox Code Playgroud)

编译现在会出错,因为该方法不会覆盖另一个方法.这提前指出了问题,并希望节省一些调试时间来追踪问题.


tro*_*foe 7

它是一个Java注释,告诉编译器该方法旨在覆盖超类中的方法.它不是绝对必要的,但确实有助于在编译时捕获错误.