第三十六条 坚持使用Override注解

这个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注解有百利而无一害,谨记。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值