原文链接
原作者:Pankaj
译者:smallclover
个人翻译,水平有限,如有错误欢迎指出,谢谢!
Java @Override注解
Java Annotations在Java1.5中被引入,Override注解是Java默认注解之一。当我们在方法上使用这个注解的时候,它将告诉编译器我们试图覆盖一个父类的方法。
让我们看看java中如何覆盖一个方法。
BaseClass.java
package com.journaldev.annotations;
public class BaseClass {
public void doSomething(String str){
System.out.println("Base impl:"+str);
}
}
现在我们将创建一个子类,该子类覆盖BaseClass类的doSomething()方法。
ChildClass.java
package com.journaldev.annotations;
public class ChildClass extends BaseClass{
//@Override
public void doSomething(String str){
System.out.println("Child impl:"+str);
}
}
请注意现在我们注释掉了@Override
注解。
现在我们创建一个测试类来检验在java中覆盖是如何工作的。
OverrideTest.java
package com.journaldev.annotations;
public class OverrideTest {
public static void main(String[] args) {
BaseClass bc = new ChildClass();
bc.doSomething("override");
}
}
以上程序输出结果如下:
Child impl:override
这里的bc
是BaseClass
类型,但是运行的时候,它所指向的对象是ChildClass
类型的,所以当我们调用doSomething(String str)
方法的时候,它会在ChildClass
中查找该方法,因此会有如上输出
现在让我们改变BaseClass
的doSomething()
方法,具体如下所示。
//Change argument from String to Object
public void doSomething(Object str){
System.out.println("Base impl:"+str);
}
你将注意到,编译器将不会抛出任何警告或者错误 并且如果你现在运行这个测试程序将得到以下输出。
Base impl:override
得到该结果的原因是 BaseClass doSomething(Object str)
方法没有被任何ChildClass
覆盖,因此会尝试调用BaseClass
的方法实现。ChildClass
只是重写了doSomething()
方法而已。
如果你没有注释掉ChildClass
中@Override
注解,在你更改了BaseClass
中的doSomething()
方法后你将会得到编译器给出的错误信息,错误信息如下所示:
The method doSomething(String) of type ChildClass must override or implement a supertype method
很明显,使用@Override
注解将会确保超类对方法签名的任何改变都将导致一个警告产生,你必须进行必要的修改来确保类正常的工作。
在编译时解决一个潜在的问题要好于在运行时解决问题,所以当你想要覆盖超类的方法的时候,请确保一直使用@Override
注解。
ps:译者认为,养成一种良好的编程习惯有助于查找错误和理清思路,对于如何管理和编辑代码,每个人应该都有自己的一套方法,仁者见仁智者见智吧。
google的Java代码编写规范Google-Java-Style,网络上已经有人做过翻译,这里只贴出了英文版的地址,中文版请自行寻找哦(≧▽≦)/