java允許在一個類中,多個方法擁有相同的名字,但在名字相同的同時,必須有不同的參數,這就是重載,編譯器會根據實際情況挑選出正確的方法,如果編譯器找不到匹配的參數或者找出多個可能的匹配就會產生編譯時錯誤,這個過程被稱爲重載的解析。
1、普通方法的重載
普通方法的重載是Java實現多態技術的重要手段,爲編程帶來了很多便利。當方法同名時,爲了讓編譯器區別他們,至少需要下面之一不同
:
(1)參數個數不同
(2)對應位置上的參數類型不同
不允許參數完全相同而只是返回值不同的情況出現。無法進行編譯,程序在eclips中顯示錯誤
2、
(I)構造方法重載
(1)在Java中,允許在一個類中定義多個構造方法。
(2)在創建對象時,系統會自動根據所調用的構造方法中包含的參數類型,個數,選擇匹配的構造方法創建對象。
(II)構造方法的注意事項
(1)如果在類中沒有明確定義構造方法,系統會自動調用默認的構造方法。
(2)如果指定了構造方法,則不調用默認的構造方法。
(3)如果已經指定了有參的構造方法,而又要調用無參的構造方法,則要在類中追加無參構造方法的定義。
3、編譯器解析的步驟按照下面的順序進行
(1)根據調用的方法名,查找是否有定義好的同名方法,如果沒有就會報錯
(2)比較形參和實參的數目是否相等,如果沒有則會報錯。如果有一個或多個方法符合條件,這些方法進入候選集
(3)與候選集中的方法比較參數表,如果對應位置上的每個參數類型完全匹配,或者可以通過擴展轉換相匹配,則該方法稱爲可行方法,併入可行集。若不存在可行方法,則會報錯
(4)在可行集中按照下面的原則選取最佳可行方法,若最佳可行方法爲0 則會報錯,否則最佳可行方法就是最終確定要調用的方法
獲取的原則是
(1)若每一個參數都可以完全匹配,它就是最佳可行方法
(2)若某個方法的每一個參數都不比別的方法差,且至少有一個參數比別的方法好,它就是最佳可行方法,這裏的差和好是指,完全匹配要比擴展轉化好,不過同樣是擴展轉換,仍然存在好喝差的問題,擴展轉換有兩條路徑
byte-short-int-long-float-double
char-int-long-float-double
這兩條路徑中位於左邊的類型都可以轉換爲右邊的類型,不過源類型與目標類型的距離越近,則這種轉化就越好。
示例 :
show(int a ,int b,int c) //1
show(int a ,int b,double c) //2
show(int a ,double b,double c) //3
show(double a,double b,int c) //4
下面是調用
show(1,2,3); //1,2,3,4都是可行方法所有參數完全匹配1
show(1.0,2.0,3.0); //沒有一個可行方法
show(1.0,2,3); //4是最佳可行方法
show(1,2.0,3); //3,4都是可行方法,沒有最佳可行方法,報錯