Overriding Methods in Java? – Always use @Override annotation(译)

472 查看

原文链接
原作者: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

这里的bcBaseClass类型,但是运行的时候,它所指向的对象是ChildClass类型的,所以当我们调用doSomething(String str)方法的时候,它会在ChildClass中查找该方法,因此会有如上输出
现在让我们改变BaseClassdoSomething()方法,具体如下所示。

//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,网络上已经有人做过翻译,这里只贴出了英文版的地址,中文版请自行寻找哦(≧▽≦)/