@Override注解的使用

Posted springmorning

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@Override注解的使用相关的知识,希望对你有一定的参考价值。

先看看@Override注解在Java SE中的声明:

package .lang;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

由Java源代码声明我们了解到:@Override注解,只能用于标记方法,并且它只在编译期生效,不会保留在class文件中。

@Override注解标记的方法声明,如果没有覆写或者实现超类的方法声明,或者不是覆写Object的public方法,那么编译就会报错。使用@Override注解,有助于我们尽早发现这样的错误:本来想声明一个“覆写”方法,却偶然声明成“重载”方法。

最经典的例子就是equal方法:

package org.springmorning.demo.javabase.annotation.pre;

/**
 * @author 春晨
 * @date 2019/1/14 20:25
 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10280122.html
 */
public class Book {

    private String name;

    public boolean equals(Book book){
        return this.equals(book.name);
    }

}

本意是想声明equals方法覆写Object类的equals方法,然而上例声明的equal方法并没有覆写Object类的equals方法,而是对equals方法重载,并且继承Object的equals方法,这样就导致微妙的bug。但是如果在上例equals方法上标记@Override注解,那么编译器就会报错,提示此方法并不是对Object的equals方法的覆写。

如下代码就体现了@Override的作用:

package org.springmorning.demo.javabase.annotation.pre;

/**
 * @author 春晨
 * @date 2019/1/14 20:25
 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10280122.html
 */
public class Book {

    private String name;

    /**
     * 标记Override,会报错,因为这是equals方法重载
     */
    @Override
    public boolean equals(Book book){
        return this.name.equals(book.name);
    }

    /**
     * 覆写Object的equals方法
     */
    @Override
    public boolean equals(Object book){
        return this.name.equals(((Book)book).name);
    }

}

还有一种比较特殊的情况,在接口声明的方法上使用@Override,这种情况是等同覆写Object的公共方法:

package org.springmorning.demo.javabase.annotation.pre;

/**
 * @author 春晨
 * @date 2019/1/16 23:24
 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10280122.html
 */
public interface Animal {

    @Override
    int hashCode();

    @Override
    boolean equals(Object o);

    @Override
    String toString();
    
}

注意:只能覆写Object示例中的三个方法,对于protected finalize()方法或者final修饰的方法是不能覆写的。

下节继续

    下节将给大家讲解预定义注解@SuppressWarnings的使用

 

 

 

以上是关于@Override注解的使用的主要内容,如果未能解决你的问题,请参考以下文章

你啥时候使用 Java 的 @Override 注解,为啥?

Java高级特性之注解

Java-注解

关于JAVA中源码级注解的编写及使用

在接口的实现类里使用@Override注解报错

Java @Override 注解