天天看點

Java @Override3. 實踐是檢驗真理的唯一标準,@Override不是那麼玩的

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的方法,必然是一個覆寫了父類的方法,不然編譯器都不讓你過。兒子得保證把爸爸的技能學到手,心裡有數才能出師。