@override注释
我实现接口时是否需要输入@Override
注释(不覆盖抽象类)?
@Override
注释实现了什么?
在Java 5中,在实现从接口inheritance的方法时,不能添加@Override
,在Java 6中,您应该(或者您将获得编译器警告)。
@Override
声明一个方法旨在覆盖某些东西,并且如果不是或不再是这种情况,将导致编译器通知您,例如因为您重写的方法已被重命名。
如果你说你实际上没有覆盖某些东西,它会破坏你的编译。
如果您没有放置@Override标记,但是根据编译器您没有覆盖任何内容,则会出现一个您不知道的无提示错误。 使用@Override标签,您就可以了解它,现在就知道了,而不是以后。
你永远不需要放一个@Override注释。 但我建议每次都这样做。
@Override
注释通知编译器该元素旨在覆盖超类中声明的元素。
它不是必需的,但如果该方法实际上没有正确覆盖超类中的方法,则会生成编译错误。
@override
基本上强制编译器检查你是否真的覆盖了现有的基类方法,而不是简单地(意外地)创建新方法。
总是使用@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 s = new HashSet (); 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
,编译器会立即提醒他们解决问题。
不,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)
- HashMap类型不是通用的; 它不能使用参数进行参数化
- java.lang.NullPointerException:尝试在空对象引用上调用虚方法’java.lang.String java.lang.Object.toString()’
- 如何在没有Java Web Start的情况下将Java控制台输出传递给文件?
- 久违后回到爪哇; 好的Java游戏开发资源?
- AsyncTask一直在等待?
- String.subString()和String.subSequence()之间的区别是什么
- 切换到横向布局时,应用程序崩溃
- 如何在java中的多个类中使用一个接口?
- 在android imageview中顺利启动和停止背景音乐