<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
?
如果想重写父类的方法,比如toString()
方法的话,在方法前面加上@Override
系统可以帮你检查方法的正确性,
@Override
public
String
toString(){...}
这是正确的
一旦写错
写成这样
@Override
public
String
tostring(){...}
编译器可以检测出这种写法是错误的
这样能保证你的确重写的方法正确
而如果不加@Override
public
String
tostring(){...}
这样编译器是不会报错的
它只会认为这是你自己新加的一个方法而已
------------------------------------------------------------
@Override
的用法:
Override
:
java.lang.Override
是一个marker
annotation
类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation
在一个没有覆盖父类方法的方法时,java
编译器将以一个编译错误来警示。
这个annotaton
常常在我们试图覆盖父类方法而确又写错了方法名时发挥威力。
使用方法极其简单:在使用此annotation
时只要在被修饰的方法前面加上@Override
。
下面的代码是一个使用@Override
修饰一个企图重载父类的toString
方法,而又存在拼写错误的sample
:
清单1
:
@Override
public
String
toSting()
{
//
注意方法名拼写错了
return
"["
+
super.toString()
+
"]";}
-------------------------------------------------------
Java6 的@override 注解与Java5 不同之处:
首先看一下下面的示例代码 :
Parent.java
public
class
Parent...{
public
void
parentMethod()
...{
}
}
IChild.java
public
interface
IChild
...{
void
interfaceMethod();
}
Child.java
public
class
Child
extends
Parent
implements
IChild
...{
@Override
public
void
parentMethod()
...{
}
@Override
public
void
interfaceMethod()
...{
}
}
由于代码很简单,我就不做说明
上述代码在jdk6 下可以编译通过
而在jdk5 下编译无法通过,输出的错误信息如下:
Child.java:7: 方法未覆盖其父类的方法
@Override
^
1 错误
上面的错误信息说在Child.java 第七行的Override 注解是不对的,不对的原因是该方法(interfaceMethod) 不是父类方法。
当然,实际上这个方法是类实现的接口中方法,但是,这个语法的jdk6 的下面是可以通过的,也就是说java6 认为类覆盖父类方法与实现接口方法都叫override ,而jdk5 不是这样认为的,不知道这是当初jdk5 的bug ,还是当初就是认为覆盖父类方法与实现接口方法是不一样的,不得而知。但是从OO 角度来看,覆盖父类方法与实现接口方法都可以认为override ,因为他们目的都是一样的,都是为了重用,都是多态的一种表现方式。这从jdk6 的支持这个功能就可以看出。
差一点忘了:
标准的java api 文档java5 与java6 对Override annotation 的的解释一样的
java5 :
Indicates that a method declaration is intended to override a method declaration in a superclass. If a method is annotated with this annotation type but does not override a superclass method, compilers are required to generate an error message.
java6 :
Indicates that a method declaration is intended to override a method declaration in a superclass. If a method is annotated with this annotation type but does not override a superclass method, compilers are required to generate an error message.
两段说明一模一样,让人搞不清楚的是java6 文档没有提到Override 对interface 的支持