Android Studio中 @override 的含义

48
我完全不了解Android Studio,想知道在Android Studio中@Override语句的作用是什么。
6个回答

93

@Override是一个Java注解。它告诉编译器,接下来的方法覆盖了其超类的方法。例如,假设你实现了一个Person类。

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

   //some methods

   @Override public boolean equals(Object other) {
      ...
   }
}

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

可以在不显式注释的情况下重写方法是合法的。那么@Override注释有什么好处呢?如果您尝试以这种方式意外地重写equals()会怎样:

public boolean equals(Person other) {
   ...
}

上述案例存在一个错误。你想要重写equals()方法,但实际上没有这么做。为什么?因为真正的equals()方法会接收一个Object类型的参数,而你的equals()方法接收的是Person类型的参数。编译器不会告诉你这个错误,因为它不知道你想要重写equals()方法。在编译器看来,你只是想要重载equals()方法。但是,如果你尝试使用@Override注解来重写equals()方法:
@Override public boolean equals(Person other) {
   ...
}

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

所以它将是一个全新的方法名称equals?取决于我如何定义它? - Chaine

20

这是一个Java注解(不是仅限于Android)。你使用它来表示这个方法要重写另一个方法。

使用它的原因是为了在你创建一个意图重写某个方法的方法时捕获错误,而通过某些错误,它实际上并没有重写成功,例如方法名称中的错别字、方法签名中的错误等。例如,有时开发人员做这样的事情:

class Foo { 
    public boolean equals(Foo other) {
       ...

作者意图覆盖超类的equals方法,但实际上没有覆盖(参数类型应为Object)。程序将会编译通过,但并不会像作者所期望的那样使用Foo.equals

class Foo {
    @Override
    public boolean equals(Foo other) {
       ...

现在编译会报错,因为该方法没有覆盖其他方法。这能够及早指出问题,希望可以节省一些调试时间来追踪问题。


7

这是一个Java注释,告诉编译器该方法意图覆盖超类的方法。虽然不是严格必需的,但可以在编译时帮助捕获错误。


4

@Override是一种Java注解

表示一个方法声明旨在覆盖超类中的方法声明。如果一个方法被注释为此注解类型,但未覆盖超类方法,则编译器将生成错误消息。

另请参阅

示例:

class Parent{
    public void foo(){

    }
}

class Child extends Parent{
    //compile perfect !
    @Override
    public void foo(){

    }
    //will show compile time error message here as it is not being overridden 
    @Override
    public void foo(int i){

    }

}

2

这是Java中的一个注解。它标记该方法旨在覆盖超类中的方法。


0

这是一个特殊的、编译器保留的 Java 注解,表示你正在覆盖一个超类方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接