1. 概述
有時候會很奇怪的發現哦,@Override這個注解有點不講道理,有時候寫它也沒問題,不寫他也沒問題,都不會有錯誤或者警告資訊。
對于天生喜歡抽象和聯想的程式猿來說,很容易産生這樣的聯想,Override的意思不是覆寫麼,加上@Override這個注解的意思應該是覆寫父類的方法吧,哈哈,天才!
然而不是的,用個例子說明下:
2. @Override用與不用,都會覆寫
不用的示例:
package org.maoge.annotationdemo;
//用于示範的父類
public class Father {
public void sayHello(){
System.out.println("Father say hello");
}
}
package org.maoge.annotationdemo;
//用于示範的子類
public class Son extends Father{
//注意,此處覆寫了sayHello,沒用@Override,也沒有任何錯誤提示和警告資訊
public void sayHello(){
System.out.println("Son say hello");
}
public static void main(String[] args) {
Father son=new Son();
son.sayHello();//輸出Son say hello,覆寫成功
}
}
用的示例,父類不變
package org.maoge.annotationdemo;
//用于示範的子類
public class Son extends Father{
//注意,此處覆寫了sayHello,用了@Override,同樣沒有任何錯誤提示和警告資訊
@Override
public void sayHello(){
System.out.println("Son say hello");
}
public static void main(String[] args) {
Father son=new Son();
son.sayHello();//輸出Son say hello,同樣覆寫成功
}
}
3. 實踐是檢驗真理的唯一标準,@Override不是那麼玩的
@Override并不是表示該方法去覆寫父類方法,而是僅僅提供一種提示功能,保證加了@Override肯定覆寫了父類的方法,以免程式猿覺得自己明明覆寫了,咋還有這種低級錯誤發生。說的太複雜,一個例子就清楚了。
package org.maoge.annotationdemo;
public class Son extends Father{
@Override
public void say_hello(){//報錯:The method say_hello() of type Son must override or implement a supertype method
System.out.println("Son say hello");
}
public static void main(String[] args) {
Father son=new Son();
son.sayHello();//輸出Son say hello,同樣覆寫成功
}
}
到了展示英文功力的時候了,The method say_hello() of type Son must override or implement a supertype method的意思是,這個叫say_hello的方法啊,它是Son類的方法啊,它啊,必須滴覆寫或者落實一個它老爸的方法。
到了這裡就很明确了,用了@Override的方法,必然是一個覆寫了父類的方法,不然編譯器都不讓你過。兒子得保證把爸爸的技能學到手,心裡有數才能出師。