Java Override/Overload

來源:互聯網
上載者:User

標籤:cannot   繼承   reference   span   pretty   應用   參數   xtend   void   

重寫(Override)

重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫!傳回值和形參都不能改變。即外殼不變,核心重寫!

重寫的好處在於子類可以根據需要,定義特定於自己的行為。

也就是說子類能夠根據需要實現父類的方法。

在物件導向原則裡,重寫意味著可以重寫任何現有方法。執行個體如下:

class Animal{   public void move(){      System.out.println("動物可以移動");   }}class Dog extends Animal{   public void move(){      System.out.println("狗可以跑和走");   }}public class TestDog{   public static void main(String args[]){      Animal a = new Animal(); // Animal 對象      Animal b = new Dog(); // Dog 對象      a.move();// 執行 Animal 類的方法      b.move();//執行 Dog 類的方法   }}

以上執行個體編譯運行結果如下:

動物可以移動狗可以跑和走

在上面的例子中可以看到,儘管b屬於Animal類型,但是它啟動並執行是Dog類的move方法。

這是由於在編譯階段,只是檢查參數的參考型別。

然而在運行時,Java虛擬機器(JVM)指定對象的類型並且運行該對象的方法。

因此在上面的例子中,之所以能編譯成功,是因為Animal類中存在move方法,然而運行時,啟動並執行是特定對象的方法。

思考以下例子:

class Animal{   public void move(){      System.out.println("動物可以移動");   }}class Dog extends Animal{   public void move(){      System.out.println("狗可以跑和走");   }   public void bark(){      System.out.println("狗可以吠叫");   }}public class TestDog{   public static void main(String args[]){      Animal a = new Animal(); // Animal 對象      Animal b = new Dog(); // Dog 對象      a.move();// 執行 Animal 類的方法      b.move();//執行 Dog 類的方法      b.bark();   }}

以上執行個體編譯運行結果如下:

TestDog.java:30: cannot find symbolsymbol  : method bark()location: class Animal                b.bark();       ^

該程式將拋出一個編譯錯誤,因為b的參考型別Animal沒有bark方法。

方法的重寫規則
  • 參數列表必須完全與被重寫方法的相同;
  • 傳回型別必須完全與被重寫方法的傳回型別相同;
  • 存取權限不能比父類中被重寫的方法的存取權限更高。例如:如果父類的一個方法被聲明為public,那麼在子類中重寫該方法就不能聲明為protected。
  • 父類的成員方法只能被它的子類重寫。
  • 聲明為final的方法不能被重寫。
  • 聲明為static的方法不能被重寫,但是能夠被再次聲明。
  • 子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了聲明為private和final的方法。
  • 子類和父類不在同一個包中,那麼子類只能夠重寫父類的聲明為public和protected的非final方法。
  • 重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
  • 構造方法不能被重寫。
  • 如果不能繼承一個方法,則不能重寫這個方法。
Super關鍵字的使用

當需要在子類中調用父類的被重寫方法時,要使用super關鍵字。

class Animal{   public void move(){      System.out.println("動物可以移動");   }}class Dog extends Animal{   public void move(){      super.move(); // 應用super類的方法      System.out.println("狗可以跑和走");   }}public class TestDog{   public static void main(String args[]){      Animal b = new Dog(); // Dog 對象      b.move(); //執行 Dog類的方法   }}

以上執行個體編譯運行結果如下:

動物可以移動狗可以跑和走
重載(Overload)

重載(overloading) 是在一個類裡面,方法名字相同,而參數不同。傳回型別呢?可以相同也可以不同。

每個重載的方法(或者建構函式)都必須有一個獨一無二的參數類型列表。

只能重載建構函式

重載規則

  • 被重載的方法必須改變參數列表;
  • 被重載的方法可以改變傳回型別;
  • 被重載的方法可以改變存取修飾詞;
  • 被重載的方法可以聲明新的或更廣的檢查異常;
  • 方法能夠在同一個類中或者在一個子類中被重載。
執行個體
public class Overloading {     public int test(){        System.out.println("test1");        return 1;    }     public void test(int a){        System.out.println("test2");    }         //以下兩個參數類型順序不同    public String test(int a,String s){        System.out.println("test3");        return "returntest3";    }         public String test(String s,int a){        System.out.println("test4");        return "returntest4";    }         public static void main(String[] args){        Overloading o = new Overloading();        System.out.println(o.test());        o.test(1);        System.out.println(o.test(1,"test3"));        System.out.println(o.test("test4",1));    }}
重寫與重載之間的區別
區別點 重載方法 重寫方法
參數列表 必須修改 一定不能修改
傳回型別 可以修改 一定不能修改
異常 可以修改 可以減少或刪除,一定不能拋出新的或者更廣的異常
訪問 可以修改 一定不能做更嚴格的限制(可以降低限制)

Java Override/Overload

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.