過載和覆蓋

2021-06-20 09:11:01 字數 1657 閱讀 3594

方法的過載:

方法名必須相同;引數個數或型別不同;對返回值不做要求,訪問許可權修飾符及final修飾符對過載也沒有影響。靜態方法和例項方法之間可以過載。

方法的覆蓋(重寫):

方法名必須相同;返回值資料型別必須完全相同;方法的引數必須完全相同,包括引數的個數、型別和順序。

此外,子類方法的訪問許可權不能嚴於父類的方法;父類靜態方法不能被子類例項方法覆蓋,父類例項方法也不允許被子類靜態方法覆蓋;父類final方法    不允許被覆蓋,但是父類非最終方法可以在子類中使用final修飾符。

過載和覆蓋的區別:

a.過載和覆蓋的方法名稱都相同,但過載要求引數列表不同,覆蓋要求引數列表完全相同

b.過載對方法前面的修飾符沒有限制,而覆蓋則對這些修飾符的使用有限制

c.同一類中的方法能互相過載,但不能互相覆蓋,子類對父類的方法可以過載也可以覆蓋

d.過載是編譯器在編譯期間就能確定呼叫哪個方法,而覆蓋則可能在執行期間才確定

過載的解析:

過載情況下,編譯器需要確定呼叫哪乙個方法。確定的唯一依據是引數列表,確定的過程稱為過載的解析。

編譯器的解析步驟如下:

1.根據呼叫的方法名,查詢是否有定義好的方法,沒有則報錯。

2.比較形參和實參的數目是否相等,不等則報錯。如果有乙個或多個符合,則這些方法進入候選集。

3.與候選集中的方法比較引數,如果對應位置上的引數型別完全匹配,或擴充套件轉換想匹配,則該方法可行,進入可行集。若不存在可行方法則報錯。

4.可行集按照下面原則選取最佳可行方法,如果可行方法沒有,則報錯。

選取原則:

a.每個引數完全匹配,則它就是最佳可行方法。

b.若某方法的每乙個引數匹配都不比別的方法差,切至少有乙個引數比別的方法好,它就是最佳可行方法。

「差」和「好」指:完全匹配要比擴充套件轉換「好」,擴充套件轉換要比完全匹配「差」。此外,擴充套件轉換之間要也存在「好」和「差」的問題。

擴充套件轉換的路徑有 byte—>short—>int—>long—>float—>double  和 char—>int—>long—>float—>double

以上路徑中,左邊的型別都可以轉換成右邊的,源型別和目標型別的距離越近,則這種轉換就越好。比如int轉換成float要比轉換成double要好。

和兩個不同型別的基本資料型別進行運算時需要自動轉型的原則一樣~~

確定最佳可行方法示例:

若有下列過載方法

a. show(int a, int b, int c);  

b. show(int a, int b, double c);

c. show(int a, double b, double c);

d. show(double a, double b, int c);

下面呼叫:

show(1, 2, 3);  // a b c d 都是可行方法,所有引數完全匹配a,它是最佳可行方法。

show(1.0, 2.0, 3.0);  // 沒有乙個方法可行,錯誤

show(1.0, 2, 3);  // 第二個引數通過擴充套件轉換匹配d, d是最佳可行方法

show(1, 2.0, 3);  // c和d都是可行方法,沒有最佳可行方法,錯誤

show(1, 2, 3.0f); // b c都是可行方法,b的第二個引數比c的第二個引數要好,多億b是最佳可行方法

過載和覆蓋

過載 overload 對於類的方法 包括從父類中繼承的方法 方法名相同,引數列表不同的方法之間就構成了過載關係。這裡有兩個問題需要注意 1 什麼叫引數列表?引數列表又叫引數簽名,指三樣東西 引數的型別,引數的個數,引數的順序。這三者只要有乙個不同就叫做引數列表不同。2 過載關係只能發生在同乙個類中...

過載 覆蓋和隱藏

部分文字內容摘自 高質量c c程式設計 1 過載 overload 1 相同的範圍,在同乙個類中。2 函式名相同,引數不同。3 virtual可有可無。這在平時設計中用的比較多,比如遊戲中角色說話,可以設計成 void senddialog const char content 預設 void se...

過載和覆蓋重寫

過載即在同乙個類中,方法名稱相同,引數列表不同 引數列表的順序不同或者引數列表的個數不同 的方法,稱為過載。public class overloaddemo public overloaddemo string name,int age public overloaddemo string nam...