这个Override注解只能用在方法声明中,它表示被注解的方法声明覆盖了超类型的一个声明。如果坚持使用这个注解,就能很大程度上避免一些错误。抽象类中,基本上没必要使用它,但如果是子类,如果是继承了父类的方法,最好使用它,因为使用后,如果不小心方法名错了,或者形参的参数名错了,都会给出提示,编译时就报错了,马上能修改,否则,方法含义定义错了,逻辑也就错了。
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 bigram) {
return bigram.first == first && bigram.second == second;
}
public int hashCode() {
return 31 * first + second;
}
public static void main(String[] args) {
Set<Bigram> bigrams = new HashSet<Bigram>();
for (int i = 0; i < 10; i++) {
for (char ch = 'a'; ch <= 'z'; ch++) {
bigrams.add(new Bigram(ch, ch));
}
}
System.out.println(bigrams.size());
}
}
这行代码的意思,是通过比较对象,装入set集合中。HashSet 是个不可重复装同一个对象的集合,这个同一个对象的逻辑,可以根据hashCode()方法和equals()方法来定义逻辑上的相同。通过读HashSet的源码,会发现先比较对象的hashCode值,然后再比较equals值,我们如果想表示对象属性一样则默认为同一对象,则重写这两个方法,就如上述代码那样,这样,集合装的就不会有重复对象了。但很遗憾,上述代码打印的是260个对象而非26个,问题出在哪了?仔细看,发现,equals()方法覆盖的不对,应该是 equals(Object o),形参错了。
@Override
public boolean equals(Object o) {
if(!(o instanceof Bigram)) {
return false;
}
Bigram b = (Bigram) o;
return b.first == first && b.second == second;
}
如果上述代码方法中添加@Override注解,equals(Bigram bigram)方法会马上报错,这就是Override注解的好处。另外一个常用到的是下面的例子,如果想重写toString()方法
@Override
public String toString(){}
上面是对的,如果一不小心,方法名字拼错了
@Override
public String tostring(){}
只要有@Override注解,编译器在编译时,马上就能提示错误。使用@Override注解有百利而无一害,谨记。