C# override重写与new隐藏的区别

来源:互联网 发布:算法设计与分析知识点 编辑:程序博客网 时间:2024/06/10 07:03

C# override重写与new隐藏的区别

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. }    

    好了,C# override重写与new隐藏的区别就介绍到这里。


原创粉丝点击