Java-多態、方法重載

來源:互聯網
上載者:User

標籤:方法   重載   多態   java   

什麼是多態、重載1. 多態對多態現象的理解

多態是物件導向的一個重要特徵。關於定義性的概念,相信網上有很多資料,不再多說。這裡說說我自己的理解。多態是指在運行期間,調用某個類對象的方法會有不同的行為。舉個最普遍的例子來說:

基類:Shape

class Shape{    public void draw();    public void clear();}

子類: Circle 、Rectangle

class Circle extends Shape{    public void draw(); //畫一個圓    public void clear();}class Rectangle extends Shape{    public void draw(); //畫一個長方形    public void clear();}

如果我聲明一個Shape類的引用,然後初始化,最後調用這個對象的draw()方法:

Shape mShape = null;mShape = init();mShape.draw();

由於Rectangle類的對象和Circle類的對象都可以向上轉換為Shape的對象,所以當我調用mShape.draw()方法後,可能會畫一個圓,也有可能會畫一個長方形,這完全取決於init()方法返回的對象是什麼。這種現象稱為多態,而且這種現象在現實中是普遍存在的,例如對來說,有汽車電動車,車都有行駛行為,對不同的車來說,會採取不同的實際行動來執行行駛這個行為,這是多態在現實中的體現。

多態發生的時機

多態發生在運行期間,這是因為不到實際運行時,我們永遠不知道init()方法返回的到底是哪個實際的對象,因此多態會延遲到運行期間發生。但是當方法是static或final修飾時,在編譯期間便進行綁定。原因是final方法不允許重寫,而static方法是跟類綁定的,與對象無關。

2.重載

很多人會將重載跟多態混淆,多態的發生必須要有繼承、重寫 , 而重載不一樣,重載是指同一個方法名(只指的是名字),有多個不同的版本,例如我們要寫一個add方法,如果是兩個數字,返回求和後的字串。如果是兩個字串,我們就將字串聯結起來。寫成代碼就是如下的樣子:

class Example{    public String addInt(int a , int b){        return (a + b) + "";    }    public String addString(String a , String b){        StringBuilder temp = new StringBuilder();        temp.append(a);        temp.append(b);        return temp.toString();    }}

但是這樣會有很多不同的方法,容易造成混淆。我們編寫一個方法的多個不同版本,根據傳入的參數不同,調用不同版本的方法。因此就有方法重載。

class Example{    public String add(int a , int b){        return (a + b);    }    public String add(String a , String b){         StringBuilder temp = new StringBuilder();        temp.append(a);        temp.append(b);        return temp.toString();    }}

根據傳入參數的不同,編譯器會調用不同版本的方法。

重載發生的時機

由於方法調用的參數是編譯期確定的,因此重載發生在編譯期

重載時方法匹配的優先順序

(引用自http://liujinpan75.iteye.com/blog/495562)

  1. 根據調用的方法名,尋找是否有定義好的同名方法,如果沒有就會報錯
  2. 比較形參和實參的數目是否相等,如果沒有則會報錯。如果有一個或多個方法符合條件,這些方法進入候選集
  3. 與候選集中的方法比較參數表,如果對應位置上的每個參數類型完全符合,或者可以通過擴充轉換相匹配,則該方法稱為可行方法,併入可行集。若不存在可行方法,則會報錯
  4. 在可行集中按照下面的原則選取最佳可行方法,若最佳可行方法為0 則會報錯,否則最佳可行方法就是最終確定要調用的方法

擷取的原則是
1. 若每一個參數都可以完全符合,它就是最佳可行方法
2. 若某個方法的每一個參數都不比別的方法差,且至少有一個參數比別的方法好,它就是最佳可行方法,這裡的差和好是指,完全符合要比擴充轉化好,不過同樣是擴充轉換,仍然存在好和差的問題,擴充轉換有兩條路徑
byte-short-int-long-float-double
char-int-long-float-double
這兩條路徑中位於左邊的類型都可以轉換為右邊的類型,不過源類型與目標類型的距離越近,則這種轉化就越好。
3. 如果存在自動裝箱和變長參數,則擴充轉換的優先順序大於自動裝箱,自動裝箱的優先順序大於變長參數。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Java-多態、方法重載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.