? 重載的條件:
??????????1.必須在同一個類中2.方法名必須相同3.參數列表不能相同。
???重寫的條件:
??????????1. 在不同的類中
????????? 2. 發(fā)生方法重寫的兩個方法返回值,方法名,參數列表必須完全一致
????????? 3. 子類拋出的異常不能超過父類相應的方法拋出的異常
????????? 4. 子類方法的訪問級別不能低于父類相應方法的訪問級別(public,package,protected, private)
????????? 5.方法體不同
super()調用父類構造,super.只能調用父類的實例方法
this()調用該類的其他構造方法,this.調用類的屬性,方法
如果父類有有參構造,子類必須定義構造方法
重載:
?????? 重載發(fā)生在同一個類中;重載主要是針對同一個類中方法名相同但參數(必須的)不同或返回類型(不是必須的)不同的情況。可以參照如下的代碼
class OverLoadTest
????{
????????public void Hello()
????????{
????????}
????????public void Hello(string str)
????????{
????????}
????????public string Hello()
????????{
????????}
????}
在這段代碼中有三個具有相同名稱的方法Hello,他們彼此之間是重載的關系,注意兩點:他們共同存在于一個類中,雖有同樣的名字但是執(zhí)行不同的操作;第一個方法和第三個方法只有返回類型不同,這在C# 中是不允許的,編譯器會報出“已定義一個名為"Hello"的方法”的錯誤。
重寫:
??????重寫發(fā)生在有繼承關系的類之間
??????重寫發(fā)生在派生類上,通過override關鍵字來改寫從其父類繼承過來的具有相同返回值,方法名稱和參數列表的方法。
????class Program
????{
????????static void Main(string[] args)
????????{
????????????OverWriteTestTT owTT = new OverWriteTestTT();
????????????owTT.Hello();
????????????overWriteTestTTT owTTT = new overWriteTestTTT();
????????????owTTT.Hello();
????????}
????}
????class OverWriteTest
????{
????????//Over write the method ToString();
????????public override string ToString()
????????{
????????????return "hello world";
????????}
????????//Define a virtual method Hello() to be over written
????????public virtual void Hello()
????????{
????????????Console.WriteLine("hello");
????????}
????}
????class OverWriteTestTT : OverWriteTest
????{
????????public override void Hello()
????????{
????????????Console.WriteLine("No hello world");
????????}
????}
????class overWriteTestTTT : OverWriteTestTT
????{
????????//Over write the method Hello() of class OverWriteTestTT
????????public override void Hello()
????????{
????????????base.Hello();
????????????Console.WriteLine("NNo hello world");
????????}
????}
上面這段代碼演示了如何對父類的方法進行重寫,需要注意的地方有兩點:可以在子類中被重寫的方法一定要被標記成virtual(虛擬), abstract(抽象), override(重寫)標記為virtual 和abstract 的函數就是為了重寫而創(chuàng)建的,標記為override的函數本身是由前兩種函數重寫而來的,所以它可以被重寫也是順理成章的了;重寫的函數必須在子類中出現,而且任何一個父類的函數在其一個子類中只能被重寫一次。(這一點很好理解,當你要重寫兩次時,該子類中將定義兩個返回類型,方法名稱 和參數列表都相同的函數,這肯定是不可能的)。