在C#中要重寫基類的方法,C#提倡在基類中使用virtual來標記要被重寫的方法,在子類也就是派生類中用voerride關鍵字來修飾重寫的方法。java
若是要是項目中前期考慮不足,我沒有在基類(ClassA)中寫入Amethod方法,可是派生類(ClassB)中因爲需求早早的寫完了Amethod方法,而且又有許多類(ClassC,ClassD..)又繼承了派生類(ClassB),而且重寫了Amethod方法。當這個時候我又想往最初的基類中(ClassA)添加Amethod方法,這就是存在一個潛在的錯誤,C#語法會在程序編譯的時候提示出警告,須要給派生類(ClassB)重寫的方法添加一個關鍵字「New」,以表示它會隱藏基類中的Amethod方法。ide
爲何在java中就不須要這麼麻煩呢?java若是不base.Amethod就認爲調用最新的子類中的重寫方法。函數
那是由於在java中,全部的函數都是虛擬的,可被重寫的。這無疑下降了性能。性能
看代碼理解:spa
1 public class People 2 { 3 public People() 4 { 5 Console.WriteLine("father' custor"); 6 } 7 public void Eat() 8 { 9 Console.WriteLine("father eat"); 10 } 11 } 12 class Man : People 13 { 14 private int age; 15 public int Age 16 { 17 get 18 { 19 Console.WriteLine("age get"); 20 return age; 21 } 22 set 23 { 24 Console.WriteLine("age set = ",value); 25 age = value; 26 } 27 } 28 public Man() 29 { 30 Console.WriteLine("son's custor"); 31 } 32 public void WhoEat() 33 { 34 base.Eat(); 35 } 36 37 public new void Eat() 38 { 39 base.Eat(); 40 Console.WriteLine("son eat!"); 41 } 42 } 43 44 class Children :Man 45 { 46 public new void Eat() { Console.WriteLine("children eat!"); } 47 }