@Override是什么

无论是在netBeans还是在eclipse开发环境中,写java代码的时候经常会碰到@Override,那么@Override具体是什么呢?

@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处:

1、可以当注释用,方便阅读

2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错

比如你如果没写@Override而你下面的方法名又写错了,这时你的编译器是可以通过的(它以为这个方法是你的子类中自己增加的方法)。

如下例所示:

class Fu
{
	private int a = 1;
	void print()
	{
		System.out.println("父类");
	}
}
class Zi extends Fu
{
	@Override
	void prin()//子类方法名与父类不同,编译会出错
	{
		System.out.println("子类");
	}
}
public class Test
{
	public static void main(String[] args)
	{
		new Zi().prin();
	}
}

因此,在我们手工复写父类的方法时,容易把方法的参数记错或方法名写错,如果此时不加@Override的话,编辑器就不会提示。

以下引自:

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

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

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

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

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

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

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

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

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

时间: 2024-12-09 12:26:43

@Override是什么的相关文章

关于makefile中变量的多次赋值以及override指令

1 基本原则如下 1.1 原则1 变量的普通赋值是有先后顺序的,后面的赋值会覆盖掉前面的赋值. 1.2 原则2 使用的时候,用的是其前面最后的赋值,就算其后面有使用了override指令的赋值也不会影响这条原则. 1.3 原则3 当使用了override指令定义赋值了变量后,其后对该变量的所有的赋值都是无效的.但是override之前的所有的赋值都是有效的.使用的时候是往前最近原则. 2 override变量.命令行参数和普通变量之间的屏蔽关系 override变量会屏蔽命令行参数,除非用+=:

Scala Study --- override

以前没使用过Scala, 其实我Java也是半截水平\无奈, 学Java的时候刚从C++中挣脱出来,发现Java无比优雅,但很快又对Java种种不信任程序员的设计感到受限. 直到, , 今天遇到了Scala\撒花 Scala的collection设计不能更赞!一段时间后打算专门写篇文章总结Scala,名字就叫"我为什么喜欢Scala!". 废话就不多说了,今天研究了一下Scala的override用法与特点. override --- one of the key words of S

android导入其他工程源码包后出现大量错误提示remove @Override annotation 的解决办法

问题描述: GitHub 下载源码后将其com包内容导入自己android项目中,大量出现错误修改提示 remove @Override annotation 问题解法: 1. 2. 3. 将Compiler compliance level:设置在1.6及以上即可

[转][C++ 11]override and final - write clean and maintainable C++ code

原文: http://arne-mertz.de/2015/12/modern-c-features-override-and-final/ Today I write about a pair of less often discussed, less complicated features introduced in C++11, which are nevertheless useful. Both can provide some additional security and cla

C# 基础 new 、override实现多台区别

一.new只是隐藏父类中的同名方法.基类和父类中都存在这个方法. namespace ConsoleApplication1 { class Program { static void Main(string[] args) { BaseClass bcdc = new DerivedClass(); bcdc.Method2(); //结果:Base - Method2 Console.Read(); } public class BaseClass { public void Method2

override Ext.grid.plugin.RowExpander的方法不起作用

Ext版本4.2 覆盖方法: Ext.override(Ext.grid.plugin.RowExpander, {     setCmp: function (grid) {         var me = this,             rowBodyTpl,             features;         console.log('我是盖子..');         me.callParent(arguments);         me.recordsExpanded 

eclipse @Override报错

三件事需要做: 1 window->Preference->java->Compiler->Compiler compliance lever->设置成最高版本(1.6以上含) 2 project->properties->java compiler->设置成跟上面一样的编译等级. 3 project->properties->Project facets(小方面) -> java设置成跟上面一致的等级. 编译一下应该就没事儿了. ecli

快学Scala 第十九课 (trait的abstract override使用)

trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super.log依旧是个abstract class,所以必须在方法前加上abstract和override.但是并没有具体介绍如何使用,然后查阅了其他文档,才明白使用方法. 下面的代码定义了超类LoggerEmpty,这个定义意味着该特质只能混入扩展LoggerEmpty的类中. 在特质中声明抽象方法中有

@Override注解

它的作用是对覆盖超类中方法的方法进行标记,如果被标记的方法并没有实际覆盖超类中的方法,则编译器会发出错误警告. /** * 测试Override注解 * @author Administrator */ public class OverrideDemoTest { //@Override public String tostring() { return "测试注解"; } }

java基础随笔-overload和override

今天重温了一下方法重载和方法重写. 首先是方法重写(override)的几点要求: 1.必须继承父类或者实现某接口的方法. 2.方法名称和参数必须和父类(或者实现的接口方法)完全一致. 3.重写的修饰符必须大于等于父类(或者实现的接口方法)的修饰符.比如父类的一个方法protected void haha(); 子类在override这个方法时必须是public void haha() 或者是 protected void haha(). 4.重写不能抛出父类没有定义的非运行时异常. 其次是方法