EffectiveJava(36) -- 坚持使用Override注解
来源:互联网 发布:易语言网络验证教程 编辑:程序博客网 时间:2024/05/16 09:25
@Override 注解: 表示被注解的方法声明覆盖了超类型中的一个声明
我们应该在想要覆盖超类声明的每个方法声明中使用 Override 注解 ; 现在的 IDE 都提供了代码检验功能 . 当一个 方法没有使用 Override 注解却覆盖了超类方法时 , IDE 就会产生警告
如 , 当我们想定义一个 Bigram 类表示一个双字母组或者有序的字母(不存相同的字母)时
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> set = new HashSet<Bigram>(); for (int i = 0; i < 10; i++) { for(char c = 'a';c<='z';c++){ set.add(new Bigram(c,c)); //System.out.println(set); } } System.out.println("setSize = "+set.size()); } }
你可能期待它输出 26 , 但实际上它输出的是 260 !
*为什么呢?*
这是因为 Bigram 意图覆盖 equals 和 hashCode , 但是实际上却是重载 . 如果要覆盖 Object.equals , 必须定义一个参数为 Object 类型的equals 的方法 , 但是 Bigram 的equals 方法的参数并不是 Object 类型 , 因为它只是从 Object 上继承了 equals . 而这个 equals 方法测试对象的统一性(如 == ) . 每个 Bigram 的备份中 , 都与其余的不同 , 因此 equals 认为他们不相等 . 如果你使用 @Override 注解了 equals 方法告诉编译器你想要覆盖它 , 那么你将会得到一条编译错误的提示 , 告诉你参数必须为 Object 类型 你需要将 equals 作如下改动:
@Override public boolean equals(Object o) { if(!(o instanceof Bigram)) return false; Bigram b = (Bigram)o; return b.first == first && b.second == second; }
这样你就会得到想要的运行结果(26)
总结:如果在你想要的每个方法声明中使用 Override 注解来覆盖超类声明 , 编译器可以替你防止大量错误 . 在具体的类中 , 不必标注你确信覆盖了抽象方法声明的方法(标注也可)
- EffectiveJava(36) -- 坚持使用Override注解
- (36):坚持使用Override注解
- 【代码优化】坚持使用Override注解
- EffectiveJava(37) -- 学会使用标记注解与标记接口
- EffectiveJava第六章:枚举和注解
- EffectiveJava(笔记五) 枚举和注解
- EffectiveJava
- EffectiveJava
- Java基本注解分析,为什么要使用@Override
- Java基本注解分析,为什么要使用@Override
- Spring@Autowired注解、@Override注解
- Spring@Autowired注解、@Override注解
- @Override @Test @... 注解
- Override注解的作用
- Java @Override注解
- @Override 注解出错
- EffectiveJava-7 J避免使用 finalizer方法
- EffectiveJava(7)避免使用终结方法
- thinking in java——0326学习笔记
- 协程的实现
- UIView的几个枚举定义
- AtCoder Beginner Contest 057
- 如何利用Bootstrap的標籤(Tabs)和導覽列(Navigation Bar)
- EffectiveJava(36) -- 坚持使用Override注解
- js面向对象总结
- 利用winhex在NTFS文件系统下定位文件,找到其目录项和簇号等等
- imresize函数进行图像缩放及利用imrotate进行图像旋转
- 九度OJ 1113 二叉树(完全二叉树)
- gcc编译过程四步
- 用java调用oracle存储过程总结
- 递归基础题:汉诺塔
- L2-019. 悄悄关注(2017初赛)