標籤:
C#比java多一個new隱藏的功能。C# override重寫相當於java中沒有關鍵字的方法重寫。所以java中方法是沒有隱藏功能的。
C# override重寫,是指對父類中的虛方法(標記virtual)或抽象方法(標記為abstract)進行重寫,實現新的功能,它必須與父類方法的簽名完全一致,而且與父類方法的可訪問性也必須一致 new隱藏,是指在子類中重新定義一個簽名與父類的方法相同的方法,這個方法可以不用new修飾,只是編譯時間會彈出一個警告資訊:如果是有意隱藏,請使用關鍵字new。
1 using System; 2 public class Test 3 { 4 public static void Main(String[] args){ 5 A a=new B(); 6 Console.Write(a.getVal()); // 輸出:A 雖然執行個體是B,但是執行的卻是A的方法 7 8 a=new C(); 9 Console.Write(a.getVal()); // 輸出:C 執行個體是C,而且C重寫的A的方法,所以執行C的方法 10 11 B b=new B(); 12 Console.Write(b.getVal()); // 輸出:B 只有定義和執行個體都是B,才執行B的方法 13 } 14 } 15 class A 16 { 17 // 要允許子類重寫,方法必須標識為virtual 或 abstract 18 public virtual String getVal(){ 19 return "A"; 20 } 21 } 22 class B : A 23 { 24 // 隱藏父類方法 用new標識,不標識時會出現編譯警告,不影響使用 25 public new String getVal(){ 26 return "B"; 27 } 28 } 29 class C : A 30 { 31 // 重寫方法 必須用override標識 32 public override String getVal(){ 33 return "C"; 34 } 35 }
而在Java中,不存在隱藏父類方法這一概念,Java只有重寫方法這一概念,同樣的代碼,在Java中執行和C#中執行截然不同:
1 class test 2 { 3 public static void main(String[] args) 4 { 5 A a=new B(); 6 // 輸出:B 執行個體是B,執行的也是B的方法(在C#中,此時應該輸出A) 7 System.out.println(a.getVal()); 8 a=new A(); 9 // 輸出:A 只有定義和執行個體都是A,才執行A的方法 10 System.out.println(a.getVal()); 11 } 12 } 13 class A 14 { 15 public String getVal(){ 16 return "A"; 17 } 18 } 19 class B extends A 20 { 21 public String getVal(){ 22 return "B"; 23 } 24 }
PS:轉載自51CTO 僅供本人學習使用
C#override與new修飾隱藏的區別(轉載)