1. 程式人生 > >C#中override重寫與new隱藏的區別,以及C#與Java的Override區別

C#中override重寫與new隱藏的區別,以及C#與Java的Override區別

在C#中:override重寫,是指對父類中的虛方法(標記為override)或抽象方法(標記為abstract)進行重寫,實現新的功能,它必須與父類方法的簽名完全一致,而且與父類方法的可訪問性也必須一致

new方法隱藏,是指在子類中重新定義一個簽名與父類的方法相同的方法,這個方法可以不用new修飾,只是編譯時會彈出一個警告資訊:如果是有意隱藏,請使用關鍵字 new。

上面2者的區別參看下面的程式碼:

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(); 

        System.out.println(a.getVal()); // 輸出:B  例項是B,執行的也是B的方法(在C#中,此時應該輸出A)



        a=new A(); 

        System.out.println(a.getVal()); // 輸出:A 只有定義和例項都是A,才執行A的方法

    }

}

class A

{

    public String getVal(){ 

        return "A"; 

    } 

} 

class B extends A

{

    public String getVal(){ 

        return "B"; 

    } 

}