面向对象重写(override)与重载(overload)区别
一、重寫(override)
override是重寫(覆蓋)了一個(gè)方法,以實(shí)現(xiàn)不同的功能。一般是用于子類在繼承父類時(shí),重寫(重新實(shí)現(xiàn))父類中的方法。
重寫(覆蓋)的規(guī)則:
?? 1、重寫方法的參數(shù)列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是重載.
?? 2、重寫方法的訪問修飾符一定要大于被重寫方法的訪問修飾符(public>protected>default>private)。
?? 3、重寫的方法的返回值必須和被重寫的方法的返回一致;
?? 4、重寫的方法所拋出的異常必須和被重寫方法的所拋出的異常一致,或者是其子類;
?? 5、被重寫的方法不能為private,否則在其子類中只是新定義了一個(gè)方法,并沒s有對其進(jìn)行重寫。
?? 6、靜態(tài)方法不能被重寫為非靜態(tài)的方法(會編譯出錯(cuò))。
?
override就是子類將父類的方法重新實(shí)現(xiàn)了一遍。 new就是說這個(gè)方法就是子類自己的,跟父類沒有任何繼承關(guān)系關(guān)系,僅僅是重名 public class A{public virtual string Function(){return "1";}}public class B : A{public override string Function(){return "2";}}public class C : A{public new string Function(){return "3";}}public class JustForTest{public void DoTest(){B b = new B();C c = new C();Console.WriteLine(b.Function());Console.WriteLine(c.Function());Console.WriteLine((b as A).Function());//這兩個(gè)就體現(xiàn)出來了,B還是調(diào)用自己,返回2Console.WriteLine((c as A).Function());//C調(diào)用的是基類,返回0 }} View Code?
?二、overload是重載,一般是用于在一個(gè)類內(nèi)實(shí)現(xiàn)若干重載的方法,這些方法的名稱相同而參數(shù)形式不同。
重載的規(guī)則:
?? 1、在使用重載時(shí)只能通過相同的方法名、不同的參數(shù)形式實(shí)現(xiàn)。不同的參數(shù)類型可以是不同的參數(shù)類型,不同的參數(shù)個(gè)數(shù),不同的參數(shù)順序(參數(shù)類型必須不一樣);
?? 2、不能通過訪問權(quán)限、返回類型、拋出的異常進(jìn)行重載;
?? 3、方法的異常類型和數(shù)目不會對重載造成影響;
多態(tài)的概念比較復(fù)雜,有多種意義的多態(tài),一個(gè)有趣但不嚴(yán)謹(jǐn)?shù)恼f法是:繼承是子類使用父類的方法,而多態(tài)則是父類使用子類的方法。
一般,我們使用多態(tài)是為了避免在父類里大量重載引起代碼臃腫且難于維護(hù)。
舉個(gè)例子:
?
?
public class Shape{public static void main(String[] args){Triangle tri = new Triangle();System.out.println("Triangle is a type of shape? " + tri.isShape());// 繼承 Shape shape = new Triangle();System.out.println("My shape has " + shape.getSides() + " sides."); // 多態(tài) Rectangle Rec = new Rectangle();Shape shape2 = Rec;System.out.println("My shape has " + shape2.getSides(Rec) + " sides."); //重載 }public boolean isShape(){return true;}public int getSides(){return 0 ;}public int getSides(Triangle tri){ //重載return 3 ;}public int getSides(Rectangle rec){ //重載return 4 ;}}class Triangle extends Shape{public int getSides() { //重寫,實(shí)現(xiàn)多態(tài)return 3;}}class Rectangle extends Shape{public int getSides(int i) { //重載return i;}} View Code?
注意Triangle類的方法是重寫,而Rectangle類的方法是重載。對兩者比較,可以發(fā)現(xiàn)多態(tài)對重載的優(yōu)點(diǎn):
如果用重載,則在父類里要對應(yīng)每一個(gè)子類都重載一個(gè)取得邊數(shù)的方法;
如果用多態(tài),則父類只提供取得邊數(shù)的接口,至于取得哪個(gè)形狀的邊數(shù),怎樣取得,在子類里各自實(shí)現(xiàn)(重寫)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/Tanghongchang/p/7140533.html
總結(jié)
以上是生活随笔為你收集整理的面向对象重写(override)与重载(overload)区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端随心记---------HTTP之H
- 下一篇: PTA 06-图2 Saving Jam