標籤:方法 重載 多態 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)
- 根據調用的方法名,尋找是否有定義好的同名方法,如果沒有就會報錯
- 比較形參和實參的數目是否相等,如果沒有則會報錯。如果有一個或多個方法符合條件,這些方法進入候選集
- 與候選集中的方法比較參數表,如果對應位置上的每個參數類型完全符合,或者可以通過擴充轉換相匹配,則該方法稱為可行方法,併入可行集。若不存在可行方法,則會報錯
- 在可行集中按照下面的原則選取最佳可行方法,若最佳可行方法為0 則會報錯,否則最佳可行方法就是最終確定要調用的方法
擷取的原則是
1. 若每一個參數都可以完全符合,它就是最佳可行方法
2. 若某個方法的每一個參數都不比別的方法差,且至少有一個參數比別的方法好,它就是最佳可行方法,這裡的差和好是指,完全符合要比擴充轉化好,不過同樣是擴充轉換,仍然存在好和差的問題,擴充轉換有兩條路徑
byte-short-int-long-float-double
char-int-long-float-double
這兩條路徑中位於左邊的類型都可以轉換為右邊的類型,不過源類型與目標類型的距離越近,則這種轉化就越好。
3. 如果存在自動裝箱和變長參數,則擴充轉換的優先順序大於自動裝箱,自動裝箱的優先順序大於變長參數。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java-多態、方法重載