无论是在netBeans还是在eclipse开发环境中,写java代码的时候经常会碰到@Override标签,平时只知道是覆盖的意思就好了~那么这个标签的价值就只有这些吗?

最近一次,重翻《Thinking in java》的时候,自己看了一下,结果这个小小的标签倒是加深了我对于面向对象的理解。

一般用途                                                                                                                                                      

  • 帮助自己检查是否正确的复写了父类中已有的方法
  • 告诉读代码的人,这是一个复写的方法

比如我们有如下基类

 1 package fruit;
 2 /**
 3  * @author Octobershiner
 4  */
 5 public class Fruit {
 6
 7     public void show_name(int num){
 8         System.out.println("Fruit: "+mum);
 9     }
10
11     public static void main(String[] args) {
12         // TODO code application logic here
13         Fruit apple  = new Apple(); //generate a kind of new fruit
14         apple.show_name(2);
15     }
16 }

之后我们编写一个Apple子类,继承这个基类。并且复写基类中的show_name()方法。

 1 package fruit;
 2
 3 public class Apple extends Fruit{
 4
 5
 6     @Override
 7     public void show_name(int num){
 8         System.out.println("Apple");
 9     }
10 }

执行的结果,显而易见就是会打印出Apple:2字样。

其实,在我们手工复写父类的方法时,容易把方法的参数记错,如果此时不加@Override的话,编辑器就不会提示你:例如我们不加这个标签,悄悄的把参数改为float型。

这个时候,其实我们并没有按照我们的意图成功复写方法,于是一个隐藏的bug就这样诞生了,相反加上Override的效果就是

IDE给出了错误提示,说明我们复写方法失败。

往往就是我们准备复写方法的时候结果,相反我们是重载了方法。

 

    Bruce的 一个思考                                                                                                                                                  

《Thinking in java》的作者Bruce在讨论这个问题的时候,提到了一个问题就是override私有的方法的例子:

现在我们向Fruit类中添加一个私有方法,而在Apple中尝试复写

1         @Override
2         private void grow(){
3         }

结果编译器会提示错误,这是一个非常低级的错误,但是有时候恰恰就不会被我们发现:那就是试着复写私有方法,但是当我们去掉Override标签的时候,编译器是不会报错的,而且可以执行。

其实Apple中的你所谓复写的grow只是一个针对于Apple本身的私有方法。完全是一个新的方法。

这就引出了一个问题,何为复写?

在面向对象中,只有接口和共有方法,继承方法才有复写,私有方法不可以复习,但是又想了一下,才明白:不是不可以复习而是,根本就不存在复写私有方法的概念!

这正是面向对象设计的初衷,私有方法本身就是为了封装在类内部,不希望别人来更改或者外部引用的,看到这里,忽然觉得,java设计的还真是不错,感觉到了思想和实现的统一。

以前总觉得override标签可有可无,但没想到会引出这么多的问题,于是乎得到一个启示:认真思考每一个语法细节的意义,思行合一,文章的最后膜拜一下Bruce.

分享一下@Override标签背后的小秘密---记录java的思行合一相关推荐

  1. @Override标签背后的小秘密---记录java的思行合一(作者:leeon)

    @Override标签 一般用途 帮助自己检查是否正确的复写了父类中已有的方法 告诉读代码的人,这是一个复写的方法 比如我们有如下基类 1 package fruit; 2 /** 3 * @auth ...

  2. Java Taste 记录java带给我们的小滋小味

    我个人比较喜欢java语言,在我心中的比重和C各占一半吧,稀疏的时间容不得太细致的总结,但是我还是将自己java以前的点点滴滴记录下来,每一篇文章就像小品文一样吧,希望大家读后能轻松愉快. 这些文章并 ...

  3. java override例子_java经常碰到的@Override标签

    无论是在netBeans还是在eclipse开发环境中,写java代码的时候经常会碰到@Override标签,平时只知道是覆盖的意思就好了~那么这个标签的价值就只有这些吗? 最近一次,重翻<Th ...

  4. java overide_java中的@Override标签,小细节大作用

    转载:http://www.cnblogs.com/octobershiner/archive/2012/03/09/2388370.html 一般用途 帮助自己检查是否正确的复写了父类中已有的方法 ...

  5. 藏在表分区统计信息背后的小秘密

    藏在表分区统计信息背后的小秘密 藏在表分区统计信息背后的小秘密 原创 2017-09-19 曾令军 数据和云 云和恩墨技术专家,8年数据库运维经验.思维敏捷,擅长于数据库开发.解决棘手的数据库故障和性 ...

  6. mysql8.0.19.0_分享MySql8.0.19 安装采坑记录

    上篇文章给大家介绍了MySql8.0.19 安装过程,需要的朋友可以点击查看.https://www.jb51.net/article/178988.htm 1.ERROR 1820 (HY000): ...

  7. mysql8.0依赖_分享MySql8.0.19 安装采坑记录

    上篇文章给大家介绍了MySql8.0.19 安装过程,需要的朋友可以点击查看.https://www.jb51.net/article/178988.htm 1.ERROR 1820 (HY000): ...

  8. java中的@Override标签

    本文章转载自:https://www.cnblogs.com/ttzz/p/8455325.html @Override标签的作用: @Override是伪代码,表示方法重写. @Override标签 ...

  9. java技术指标_使用 Micrometer 记录 Java 应用性能指标

    使用 Micrometer 记录 Java 应用性能指标 成 富 2019 年 2 月 13 日发布 运行良好的应用离不开对性能指标的收集.这些性能指标可以有效地对生产系统的各方面行为进行监控,帮助运 ...

最新文章

  1. Fiddler抓取HTTPS包
  2. mongodb学习篇
  3. python关键字匹配_python通过BF算法实现关键词匹配的方法
  4. python中字典的常用函数_Python字典dict常用方法函数实例
  5. 布隆过滤器的原理、应用场景和源码分析实现
  6. 解决使用MinGW编译C++代码报cannot find -lxxxx的问题
  7. python爬虫网页pdf_爬虫实战【3】Python-如何将html转化为pdf(PdfKit)
  8. java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用
  9. 堆、队列、栈、链表对比
  10. python编程(json数据输入)
  11. SAP License:SAP传输错误所引起的系统崩溃事件反思
  12. python stringvar.get_Python StringVar get函数什么都不返回?
  13. isbool php,PHP PHPUnit assertIsBool()用法及代码示例
  14. 华为机试HJ38:求小球落地5次后所经历的路程和第5次反弹的高度
  15. Vue中无法更改element ui组件样式问题
  16. Faster-RCNN.Pytorch的使用
  17. Matlab 导入数据操作
  18. sort(function(a,b){return a -b})函数排序问题
  19. 计算机软件需要加书名号吗,软件著作权名称需要加书名号吗-举例说明一个软件的名称放在句子里应不应该用书名号,为什么?...
  20. 服务器网口灯亮但显示未插网线,网线插路由器WAN口,但WAN口灯不亮怎么办?

热门文章

  1. bzoj3507: [Cqoi2014]通配符匹配
  2. windows安装Python模块:requests
  3. LA 6892 The Safe Secret(矩阵连乘)
  4. OC基础 代理和协议
  5. 近似装箱问题(三种联机算法实现)
  6. 【Java】Servlet 工作原理解析
  7. AA065VD时序的确定
  8. 如何在GitHub上大显身手?
  9. Mac 环境下连接多个git — ssh方式
  10. spring boot 传递 List参数