在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 }