资讯专栏INFORMATION COLUMN

Overriding Methods in Java? – Always use @Override

Ryan_Li / 1945人阅读

摘要:原文链接原作者译者个人翻译,水平有限,如有错误欢迎指出,谢谢注解在中被引入,注解是默认注解之一。现在我们创建一个测试类来检验在中覆盖是如何工作的。得到该结果的原因是方法没有被任何覆盖,因此会尝试调用的方法实现。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65815.html

相关文章

  • Java Interview Questions (1)

    What is Java? Java is a high-level platform-independent object oriented programming language. List some features of Java? Object Oriented, Platform Independent, Multi-threaded, Interpreted, Robust, pa...

    xuxueli 评论0 收藏0
  • [LintCode] Shape Factory

    摘要:这道题考了,具体概念如下除此之外,还需要注意正则表达式的写法。 Problem Factory is design pattern in common usage. Implement a ShapeFactory that can generate correct shape. Example ShapeFactory sf = new ShapeFactory(); Shape s...

    zebrayoung 评论0 收藏0
  • Java interview question

    what is the difference between overriding and overloading? Overriding is resolved at runtime while overloading is compile time. Override: is a language feature that allows a subclass to provide a spec...

    thekingisalwaysluc 评论0 收藏0
  • JVM执行方法调用(一)- 重载与重写

    摘要:重写语言中的定义子类方法有一个方法与父类方法的名字相同且参数类型相同。父类方法的返回值可以替换掉子类方法的返回值。思维导图参考文档极客时间深入拆解虚拟机是如何执行方法调用的上广告 原文 回顾Java语言中的重载与重写,并且看看JVM是怎么处理它们的。 重载Overload 定义: 在同一个类中有多个方法,它们的名字相同,但是参数类型不同。 或者,父子类中,子类有一个方法与父类非私有方...

    韩冰 评论0 收藏0
  • 从一段代码谈起——浅谈JavaIO接口

    摘要:缓冲输入流从被称为缓冲区的存储器区域读出数据仅当缓冲区是空时,本地输入才被调用。同样,缓冲输出流,将数据写入到缓存区,只有当缓冲区已满才调用本机输出。 :https://segmentfault.com/blog... 1.前言 前阵子休息天日常在寻找项目里不好的代码,看到了这样的一段代码: private Result sshSameExec(Session session,...

    pkwenda 评论0 收藏0

发表评论

0条评论

Ryan_Li

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<