標籤:
Overload:顧名思義,就是Over(重新)——load(載入),所以中文名稱是重載。
它可以表現類的多態性,可以是函數裡面可以有相同的函數名但是參數名、傳回值、類型不能相同;
或者說可以改變參數、類型、傳回值但是函數名字依然不變。
Override:就是ride(重寫)的意思,在子類繼承父類的時候子類中可以定義某方法與其父類有相同的名稱和參數,
當子類在調用這一函數時自動調用子類的方法,而父類相當於被覆蓋(重寫)了。
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。
重寫Overriding是父類與子類之間多態性的一種表現,
重載Overloading是一個類中多態性的一種表現。
如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。
子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。
如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,
則稱為方法的重載(Overloading)。Overloaded的方法是可以改變傳回值的類型。
overload和override的區別
override(重寫)
1、
方法名、參數、傳回值相同。
2、子類方法不能縮小父類方法的存取權限。
3、子類方法不能拋出比父類方法更多的異常(但子類方法可以不拋出異常)。
4、存在於父類和子類之間。
5、方法被定義為final不能被重寫。
overload(重載)
1、參數類型、個數、順序至少有一個不相同。
2、不能重載只有傳回值不同的方法名。
3、存在於父類和子類、同類中。
java中的繼承,方法覆蓋(重寫)override與方法的重載overload的區別
方法的重寫(Overriding)和重載(Overloading)是Java多態性的不同表現。
重寫(Overriding)是父類與子類之間多態性的一種表現,而重載(Overloading)是一個類中多態性的一種表現。 如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding) 。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被屏蔽了。 如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型或有不同的參數次序,則稱為方法的重載(Overloading)。不能通過存取權限、傳回型別、拋出的異常進行重載。
1. Override 特點
1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全符合,才能達到覆蓋的效果;
2、覆蓋的方法的傳回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4、方法被定義為final不能被重寫。
5、對於繼承來說,如果某一方法在父類中是存取權限是private,那麼就不能在子類對其進行重寫覆蓋,如果定義的話,也只是定義了一個新方法,而不會達到重寫覆蓋的效果。(通常存在於父類和子類之間。)
2.Overload 特點
1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));
2、不能通過存取權限、傳回型別、拋出的異常進行重載;
3、方法的異常類型和數目不會對重載造成影響;
4、重載事件通常發生在同一個類中,不同方法之間的現象。
5、存在於同一類中,但是只有虛方法和抽象方法才能被覆寫。
其具體實現機制:
overload是重載,重載是一種多重參數變形機制,即代碼通過參數的類型或個數不同而實現的多態機制。 是一種靜態綁定機制(在編譯時間已經知道具體執行的是哪個程式碼片段)。
override是覆蓋。覆蓋是一種動態綁定的多態機制。即在父類和子類中同名元素(如成員函數)有不同 的實現代碼。執行的是哪個代碼是根據運行時實際情況而定的。 Overrride執行個體 :
class A{ public int getVal(){ return(5); } } class B extends A{ public int getVal(){ return(10); } } public class override { public static void main(String[] args) { B b = new B(); A a= (A)b;//把 b 強 制轉換成A的類型 int x=a.getVal(); System.out.println(x); } }
結果:10
Overload執行個體:
//Demostrate method voerloading. class OverloadDemo { void test(){ System.out.println("NO parameters"); } void test(int a){ System.out.println("a:"+a); }//end of Overload test for one integer parameter. void test(int a, int b){ System.out.println("a and b:"+a+" "+b); }double test(double a){ System.out.println("double a:"+a); return a*a; }} public class Overload{ public static void main(String[] args) { OverloadDemo ob = new OverloadDemo(); double result; ob.test(); ob.test(10); ob.test(10, 20); result = ob.test(123.25); System.out.println("Result of ob.test(123.25):"+result);}}
結果:
NO parameters
a:10
a and b:10 20
double a:123.25
Result of ob.test(123.25):15190.5625 C++中Overload、Overwrite及Override的區別
Overload(重載):
在C++程式中,可以將語義、功能相似的幾個函數用同一個名字表示,
但參數或傳回值不同(包括類型、順序不同),即函數重載。
(1)相同的範圍(在同一個類中);
(2)函數名字相同;
(3)參數不同;
(4)virtual 關鍵字可有可無。
Override(覆蓋):是指衍生類別函數覆蓋基類函數,特徵是:
(1)不同的範圍(分別位於衍生類別與基類);
(2)函數名字相同;
(3)參數相同;
(4)基類函數必須有virtual 關鍵字。
Overwrite(重寫):是指衍生類別的函數屏蔽了與其同名的基類函數,規則如下:
(1)如果衍生類別的函數與基類的函數同名,但是參數不同。
此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
(2)如果衍生類別的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。
此時,基類的函數被隱藏(注意別與覆蓋混淆)。
#include <stdio.h>#include <iostream>class Parent{public: void F() { printf("Parent.F()/n"); } virtual void G() { printf("Parent.G()/n"); } int Add(int x, int y) { return x + y; } //重載(overload)Add函數 float Add(float x, float y) { return x + y; }};class ChildOne:Parent{ //重寫(overwrite)父類函數 void F() { printf("ChildOne.F()/n"); } //覆寫(override)父類虛函數,主要實現多態 void G() { printf("ChildOne.G()/n"); }};int main(){ ChildOne childOne;// = new ChildOne(); Parent* p = (Parent*)&childOne; //調用Parent.F() p->F(); //實現多態 p->G(); Parent* p2 = new Parent(); //重載(overload) printf("%d/n",p2->Add(1, 2)); printf("%f/n",p2->Add(3.4f, 4.5f)); delete p2; system("PAUSE"); return 0;}
Overload和Override的區別 C++ Java