@override注释

时间:2011-03-31 21:09:33

标签: java

实现接口时是否需要放置@Override注释(不覆盖抽象类)?

@Override注释实现了什么?

6 个答案:

答案 0 :(得分:21)

在Java 5中,在实现从接口继承的方法时,不能添加@Override,在Java 6中,您应该(或者您将收到编译器警告)。

@Override断言一个方法旨在覆盖某些东西,并且会导致编译器在没有或不再是这种情况时通知您,例如因为您重写的方法已被重命名。

答案 1 :(得分:17)

如果你说你实际上没有覆盖某些内容,它会破坏你的编译。

如果您没有放置@Override标记,但根据编译器您没有覆盖任何内容,您有一个您不知道的无声错误。使用@Override标记,您就可以了解它,现在就知道它,而不是更晚。

从不需要来放置@Override注释。但我建议每次都这样做。

答案 2 :(得分:7)

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

这不是必需的,但如果该方法实际上没有正确覆盖超类中的方法,则会产生编译错误。

答案 3 :(得分:6)

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

答案 4 :(得分:2)

总是使用@Override是一种好习惯,因为它可以帮助您抢先捕获一些其他阴险的错误。它还增强了代码清晰度。例如,查看 Effective Java ,第6章,第36项中给出的示例:

// 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());
    }
}

这种方法乍一看可能看起来很好,但实际上它很破碎!程序员没有遵循equals(Object o)的合同,而是实施equals(Bigram b),在执行依赖equals()的事情时 将被调用。即,将Bigram的实例插入Map。因此,这将导致难以追踪的混乱,微妙的错误行为,而如果程序员首先使用@Override,编译器会立即提醒他们解决问题。

答案 5 :(得分:0)

不,Java不会绑定您在实现接口时放置@Override注释。您可以像往常一样覆盖在interface中声明的方法。 但是,在覆盖接口或任何父类(包括抽象类)的方法时,使用@Override注释是一种很好的做法。 为什么?因为它有助于我们/编译器识别在编译时覆盖方法的任何问题。

例如:http://java-dive.blogspot.in/

 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)