@Override标签和Ecilipse中使用

http://blog.csdn.net/dull_boy2/article/details/40111637

学而时习之,写java代码的时候经常会碰到@Override标签,作用:

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

   

  在Android开发过程中会引用大量的标准库,还要通过Override基类函数实现特定的应用需求,每次要手动输入标准的函数调用,编程效率不高
  Eclipse考虑到这一点,可以快速准确的Override一个基类.
基本步骤:
1.需要插入Override函数的位置点击右键,选择Source->Override/Implement Methods...
2.选择需要添加的函数名(还可以选择“Insert Point”重新定向插入位置)
3.这样code里就插入了完整而准确的 Override 结构了
设置快捷键快速打开Override/Implement Methods对话框,步骤如下:
1.window-->  ( mac 中为 ADT菜单下)
2.preferrence-->
3.general-->
4.keys-->
5.找到Override/Implement Methods,Binding文本框中按下Shift+Alt+R即可。

   常见问题:

java @override 报错处理

做项目的时候,其它电脑上编译通过的java代码,导入工程后却是编译不通过,总是@override报错,把@override去掉就好了,有时候@Override出现的地方很多,要全部删除@Override很繁琐很吐血,不能从根本上解决问题。网上找了一下原因,才知道:

据说这是jdk的问题,@Override是JDK5就已经有了,但有个小小的Bug,就是不支持对接口的实现,认为这不是Override 而JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Override。
首先要确保安装了jdk 1.6,

然后,在eclipse中修改配置,在 Windows->Preferences-->java->Compiler-->compiler compliance level 中选择 1.6,刷新工程,重新编译下;
如果还是不行,就在报错的工程上,鼠标右键选择 Properties-->Java Compiler-->compiler compliance level中选择 1.6,刷新工程,重新编译下。

   详细例子如下: 

   比如我们有如下基类

复制代码
 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"+mum);
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.

 



参考:

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

http://blog.csdn.net/chindroid/article/details/7653289

http://www.cnblogs.com/_programmer/archive/2012/04/27/2472906.html


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值