C# override重寫與new隱藏的區別
C#比java多一個new隱藏的功能。C# override重寫相當于java中沒有關鍵字的方法重寫。所以java中方法是沒有隱藏功能的。
C# override重寫,是指對父類中的虛方法(標記virtual)或抽象方法(標記為abstract)進行重寫,實現新的功能,它必須與父類方法的簽名完全一致,而且與父類方法的可訪問性也必須一致 new隱藏,是指在子類中重新定義一個簽名與父類的方法相同的方法,這個方法可以不用new修飾,只是編譯時會彈出一個警告信息:如果是有意隱藏,請使用關鍵字new。
- using System;
- public class Test
- {
- public static void Main(String[] args){
- A a=new B();
- Console.Write(a.getVal()); // 輸出:A 雖然實例是B,但是執行的卻是A的方法
- a=new C();
- Console.Write(a.getVal()); // 輸出:C 實例是C,而且C重寫的A的方法,所以執行C的方法
- B b=new B();
- Console.Write(b.getVal()); // 輸出:B 只有定義和實例都是B,才執行B的方法
- }
- }
- class A
- {
- // 要允許子類重寫,方法必須標識為virtual 或 abstract
- public virtual String getVal(){
- return "A";
- }
- }
- class B : A
- {
- // 隱藏父類方法 用new標識,不標識時會出現編譯警告,不影響使用
- public new String getVal(){
- return "B";
- }
- }
- class C : A
- {
- // 重寫方法 必須用override標識
- public override String getVal(){
- return "C";
- }
- }
而在Java中,不存在隱藏父類方法這一概念,Java只有重寫方法這一概念,同樣的代碼,在Java中執行和C#中執行截然不同:
- class test
- {
- public static void main(String[] args)
- {
- A a=new B();
- // 輸出:B 實例是B,執行的也是B的方法(在C#中,此時應該輸出A)
- System.out.println(a.getVal());
- a=new A();
- // 輸出:A 只有定義和實例都是A,才執行A的方法
- System.out.println(a.getVal());
- }
- }
- class A
- {
- public String getVal(){
- return "A";
- }
- }
- class B extends A
- {
- public String getVal(){
- return "B";
- }
- }
好了,C# override重寫與new隱藏的區別就介紹到這里。
【編輯推薦】