首先先看override和new的語法特征:
-
override
1. override是派生類用來重寫基類中方法的;
2. override不能重寫非虛方法和靜態方法;
3. override只能重寫用virtual、abstract、override修飾的方法;
4. 不能使用修飾符 new、static、virtual 或 abstract 來修改 override 方法。
new
1. new是派生類用來隱藏基類中的方法的;也就是說在派生類中“看不到”基類中的方法;
2. 如果要在派生類中隱藏(不是重寫)基類中的方法,而沒有使用new關鍵字,編譯時會出現一個警告,提示如果是要隱藏基類中的方法,請使用new關鍵字【默認是new修飾的】;
3. 派生類可以隱藏基類中的虛方法,也可以隱藏基類中的普通方法。
4. 如果在派生類中用private來修飾new 方法,那么只在該派生類中隱藏了基類中的方法,在該派生類之外,相當於沒有隱藏基類中的方法;
5. 如果在派生類中隱藏了基類中的方法,在該派生類的派生類中,將延續對該派生類對基類方法的隱藏。
測試結論:
- 經測試:只有類中有虛方法重寫override,才會表現出運行時類型方法特征。其他無論是不是虛方法,是不是有new 修飾,是不是有override 修飾,都表現出編譯時類型方法特征【即聲明的類型是什么就調用什么方法】。
以下是測試方法內容:
//1、虛方法重寫override,運行時類型方法特征。
//1.1、虛方法未重寫,編譯時【未重寫派生類調用基類方法】產生裝箱或轉型
//1.2、虛方法重寫new或沒有new也沒有override,編譯時【重寫派生類隱藏基類方法】
//2、非虛方法重寫。編譯時【重寫派生類隱藏基類方法】
//3、非虛方法未重寫,調用基類方法。編譯時【未重寫派生類調用基類方法】產生裝箱或轉型
代碼

1 public class TestShape 2 { 3 public static void Main(string[] args) 4 { 5 //主要測試:1、虛方法重寫override,運行時類型方法特征。 6 //1.1、虛方法未重寫,編譯時【未重寫派生類調用基類方法】裝箱或轉型 7 //1.2、虛方法重寫new或沒有new也沒有override,編譯時【重寫派生類隱藏基類方法】 8 //2、非虛方法重寫。編譯時【重寫派生類隱藏基類方法】 9 //3、非虛方法未重寫,調用基類方法。編譯時【未重寫派生類調用基類方法】裝箱或轉型 10 11 //1、 12 Shape shape = new Circle(); 13 shape.MethodVirtual();//circle override MethodVirtual 14 //2、編譯時 15 Diamond diamond = new Diamond(); 16 diamond.Method();//Diamond default Method 17 Shape s = new Diamond(); 18 s.Method();//base Method call 19 //結論:非虛方法重寫編譯時 類型方法。 20 //1.2 編譯時 21 diamond.MethodVirtual();//Diamond default MethodVirtual,沒有使用override默認是new 22 s.MethodVirtual();//base MethodVirtual call,沒有使用override默認是new 23 //3、編譯時 24 Circle circle = new Circle(); 25 circle.Method();//base Method call 26 } 27 } 28 public class Shape 29 { 30 public virtual void MethodVirtual() 31 { 32 Console.WriteLine("base MethodVirtual call"); 33 } 34 public void Method() 35 { 36 Console.WriteLine("base Method call"); 37 } 38 } 39 public class Circle: Shape 40 { 41 public override void MethodVirtual() 42 { 43 Console.WriteLine("circle override MethodVirtual"); 44 } 45 } 46 public class Triangle : Shape 47 { 48 public new void MethodVirtual() 49 { 50 Console.WriteLine("Triangle new MethodVirtual"); 51 } 52 public new void Method() 53 { 54 Console.WriteLine("Triangle new Method"); 55 } 56 } 57 public class Diamond : Shape 58 { 59 //默認是使用了new關鍵字 60 public void MethodVirtual() 61 { 62 Console.WriteLine("Diamond default MethodVirtual"); 63 } 64 public void Method() 65 { 66 Console.WriteLine("Diamond default Method"); 67 } 68 }
語言對比:
Java——默認虛方法
默認情況下,Java中的方法都是虛方法。假如希望方法具有非虛的行為,就必須顯式密封它。相反,C#的方法默認為非虛方法。