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