@Overide表示了该类中的方法显示地覆盖了父类的方法,这个事情一定发生在类继承关系中。
比如我们先定义一个CD类,该类默认会继承Object类,Object中常用的方法有tostring().equals()等等。
一 知识准备
基本tezhi覆盖(override)与重载(overload)的区别:
重载(overload)指在方法名不同,但参数列表相同的函数,即函数签名不同。可以发生在基本函数中,也可以发生在类继承过程中。
盖(override)指方法名和参数列表都相同的函数,即函数签名相同。一般特指在类继承关系中才会发生该过程,即只会在面向对象中发生。而重载(overload)可以在非面向对象语言中也可能发生。
二 @Override
在eclips中,可以使用在窗口中source》Override/implement method命令栏,点击后会弹出要覆盖父类哪些方法,如下所示:
测试源代码为:
package notebook;
public class CD {
private String title;
private String artist;
private int numofTracks;
private boolean gotIt = false;
private String comment;
public CD(String title, String artist, int numofTracks, boolean gotIt, String comment)
{
super();
this.title = title;
this.artist = artist;
this.numofTracks = numofTracks;
this.gotIt = gotIt;
this.comment = comment;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
CD cc = (CD)obj;//向下造型
return artist.equals(cc.artist);
}
public void add(CD cd)
{
}
public static void main(String[] args) {
// TODO Auto-generated method stub
CD cd1 = new CD("a","b",3,true,"...");
CD cd2 = new CD("a","b",3,true,"...");
System.out.println(cd1.equals(cd2));
}
}
我们重新覆盖了equals()方法。结果如下所示:
三 分析
如果我们把@Override注释掉,就可以改变入参的类型,返回值等等
报错:
注释后,成功:
此时已经不是覆盖,而是变成了重载。因为函数签名已经变化了,这里是函数参数列表发生了变化。
我们知道Object.equals()中原来方式的入参就是Object类型,所以使用 @Override 修饰器的目的就是告诉编译器,该方法是覆盖。要保证函数名,参数列表和父类的一致。当然其中的具体实现可以自己修改。
当然@Override还能帮助自检,当发生一些修改时,可能会改变覆盖的特性,此时就会提示错误。
需要注意的是覆盖和重载的区别和联系,理解好这2个定义后,就不难理解为什么会有@Override这个修饰器了,因为要方便程序员阅读和理解嘛。