Java @覆盖注释

Java @覆盖注释,java,Java,当我实现一个接口(而不是重写一个抽象类)时,我是否需要放置@Override注释 那么,@Override注释实现了什么呢?如果你说你覆盖了一些实际上没有覆盖的东西,它会破坏你的编译 如果您没有放置@Override标记,但根据编译器,您没有覆盖任何内容,那么您有一个不知道的无声bug。使用@Override标记,您确实知道它,并且您现在知道它,而不是以后 您永远不需要放置@Override注释。但是我建议每次都这样做。@override基本上强制编译器检查您是否真的覆盖了现有的基类方法,而不是

当我实现一个接口(而不是重写一个抽象类)时,我是否需要放置
@Override
注释


那么,
@Override
注释实现了什么呢?

如果你说你覆盖了一些实际上没有覆盖的东西,它会破坏你的编译

如果您没有放置@Override标记,但根据编译器,您没有覆盖任何内容,那么您有一个不知道的无声bug。使用@Override标记,您确实知道它,并且您现在知道它,而不是以后


您永远不需要放置@Override注释。但是我建议每次都这样做。

@override
基本上强制编译器检查您是否真的覆盖了现有的基类方法,而不是简单地(意外地)覆盖创建新方法。

注释
@Override
通知编译器该元素将覆盖在超类中声明的元素


它不是必需的,但如果该方法实际上没有正确重写超类中的方法,它将生成编译错误。

在Java 5中,当实现从接口继承的方法时,您不能添加
@override
,在Java 6中,您应该这样做(否则会收到编译器警告)


@Override
声明某个方法打算重写某些内容,并将导致编译器通知您,如果情况不是这样或不再是这样,例如,因为您要重写的方法已被重命名。

始终使用
@Override
是一种良好的做法,因为它可以帮助您先发制人地捕获一些潜在的bug。它还提高了代码的清晰度。例如,查看有效Java第6章第36项中给出的示例:

//你能发现这个错误吗?-第176页
包org.effectivejava.examples.chapter06.item36;
导入java.util.HashSet;
导入java.util.Set;
公共类二元图{
私人最终字符优先;
二等兵;
公共二进制存储器(字符第一,字符第二){
this.first=first;
这个秒=秒;
}
公共布尔等于(Bigram b){
返回b.first==first和&b.second==second;
}
公共int hashCode(){
返回31*first+second;
}
公共静态void main(字符串[]args){
Set s=新的HashSet();
对于(int i=0;i<10;i++)

对于(char ch='a';chNO),Java在实现接口时不会约束您放置@Override注释。您可以像我们通常做的那样重写接口中声明的方法。 但是,在重写接口或任何父类(包括抽象类)的方法时,使用@Override注释是一种很好的做法。 为什么?因为它可以帮助我们/编译器识别在编译时重写方法的任何问题

例如:


相关:编译器警告通常是可配置的;例如Eclipse默认关闭了它。最佳答案!非常简单。谢谢。
// Can you spot the bug? - Page 176
package org.effectivejava.examples.chapter06.item36;

import java.util.HashSet;
import java.util.Set;

public class Bigram {
    private final char first;
    private final char second;

    public Bigram(char first, char second) {
        this.first = first;
        this.second = second;
    }

    public boolean equals(Bigram b) {
        return b.first == first && b.second == second;
    }

    public int hashCode() {
        return 31 * first + second;
    }

    public static void main(String[] args) {
        Set<Bigram> s = new HashSet<Bigram>();
        for (int i = 0; i < 10; i++)
            for (char ch = 'a'; ch <= 'z'; ch++)
                s.add(new Bigram(ch, ch));
        System.out.println(s.size());
    }
}
 class Ball{
        public void bounce(){
        }
        } 

//////////////////////Override without @Override/////////////////////////////

    public class FootBall{
    public void bounce(String s){
    }
    }

//this will compile however new FootBall().bounce(); will call parent method.

//////////////////////Override with @Override/////////////////////////////

    public class FootBall{
    @Override
    public void bounce(String s){
    }
    }

//This will not compile as the parent class doent have any method with signature bounce(String s)