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

转载:http://www.cnblogs.com/octobershiner/archive/2012/03/09/2388370.html

一般用途                                                                                                                                                      

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

比如我们有如下基类

 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 here13         Fruit apple  = new Apple(); //generate a kind of new fruit14         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         @Override2         private void grow(){3         }

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

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

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

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

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

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

时间: 2024-11-08 05:59:25

java中的@Override标签,小细节大作用的相关文章

[小细节,大BUG]记录一些小问题引起的大BUG(长期更新....)

[小细节,大BUG]  1. 在不久前,一个朋友出现了这样一个BUG:当UITableView加载cell的时候,自定义的cell,怎么显示,里面的文字总是显示不完全(注意,文字不长).然后,我帮忙给看了下,甚至把在storyBoard中将cell的相关属性都试了下,虽然可以解决,但是效果不理想.最终经过排查,终于发现问题所在:当自定义cell时,因为需要布局子控件,所以他重写了layoutSubviews方法,然而在此方法中没有调用[super layoutSubviews],所以造成了布局混

Java中替换HTML标签的方法代码

这篇文章主要介绍了Java中替换HTML标签的方法代码,需要的朋友可以参考下 replaceAll("\\&[a-zA-Z]{0,9};", "").replaceAll("<[^>]*>", "\n\t") 源码如下: /** * 字符串替换 */ package com.you.model; /** * HTML标签替换 * @author YHD * @version */ public cla

java中匿名类的注意细节

abstract class Outer{ int num; public Outer(int x){ num = x; } public abstract void show1(); public abstract void show2(); } public class PC{ public static void main(String[] args){ new Outer(55)//构造父类部分 //子类重写部分 { public void show1(){ System.out.pri

JAVA中的break[标签]continue[标签]用法

原文:JAVA中的break[标签]continue[标签]用法 注意:JAVA中的标签必须放在循环之前,且中间不能有其他语句.例如:tag:for或while或do--while; 1.使用break退出一层循环(与C/C++中的break用法一样) 1 public static void main(String args[]) 2 { 3 int i=0; 4 while(i<100) 5 { 6 if(i==10) break; 7 System.out.println("i=&q

请说明Java中字符&#39;\&#39;的含义,有什么作用?

/* * 2. 请说明Java中字符'\'的含义,有什么作用? * * 回答: * 在java中反斜杠'\'代表的含义是转义字符,是一个标记 * * 当编译器读到这个标记的时候,它就知道下一个字符不是普通的字符,而是被转译的字符 * 它会依据转义字符的含义做操作,而不是直接的使用原字符. * *当遇到一些java语法中被占用的特殊字符的时候,要想原样的输出,就需要在这些特殊的字符前面加入反斜杠 *比如反斜杠本身,单引号,双引号,小括号等,因为语法已经占用,所以要想原样的输出,只有在前面在加一个反

【小命令大作用】cd 命令

[小命令大作用]cd 命令 cd命令可以说是linux中最常用的命令,那么下面来看看你所熟悉又陌生的cd. [命令格式] cd (目录名) [命令功能] cd的主要就是切换目录层次,到达指定目录. [使用实例] 1.切换至当前用户的家目录. [[email protected] ~]# cd ~ [[email protected] ~]# pwd /root 扩展:~代表当前用户的家目录,pwd显示当前所在目录. 2.接题1,切换到上级目录.

【小命令大作用】第三篇 ls 命令 - 查看目录或文件

ls命令查看目录或文件 [语法] ls [选项] (路径) [常用选项] -l    长文本查看文件=windows的右键属性 -d    查看目录 PS:一般配合-l使用 -a    查看目录下所有文件(包括隐藏文件) -i    显示索引号(inode) -F    给文件加标识 -t    以文件修改时间排序 -r    倒序排列 -k    以K为单位显示大小 [实例] 查看/etc/最近修改的文件并以长格式显示 [[email protected] ~]# ls -lrt /etc/ 

Xcode中文件名旁边的小标记的作用

这两天老大教会了我要留意Xcode中文件名右边的小标记,例如: 这里的M就是Xcode中类名旁边的一个symbol,还有A,D等,这些标记用于显示当前文件和代码仓库中该文件对比后的状态: M = Locally modified U = Updated in repository A = Locally added D = Locally deleted I = Ignored R = Replaced in the repository – = The contents of the fold

eclipse下java中注释字体太小和xml中中文字体太小问题解决方法

我们在win7下进行android应用开发,需要搭建相应的开发环境.现在普遍基本上都是eclipse+adt+sdk,在本人搭建完环境后,发现eclipse下,java中的注释和xml中的中文字体变得特别小,无法看的清楚.解决方法如下: 1.Java中字体变大方法: 打开eclipse,Window-->Preferences,如下图打开: 双击第二个红色框,如下图: 将字体改成五号即可. 2.xml中中文字体太小解决方法: 打开eclipse,Window-->Preferences--&g