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 }  

PS:转载自51CTO 仅供本人学习使用

时间: 2024-12-27 14:23:02

C#override与new修饰隐藏的区别(转载)的相关文章

C#中override和new修饰符的区别

(new)“隐藏”,(override)“覆盖”(重写).不过要弄清楚这两个有什么区别确实也很难,因为子类在使用父类方法时根本看不出区别,子类不管父类是new了还是override了,用的都是父类方法.区别就在于,一个子类对象中,用父类类型指针去访问子类成员时有区别. 如果是new的,那么父类的这个函数地址仍然保留着,同时又提供了一个新的子类的该函数入口地址.也就是说子类对象中同时保存了两个入口地址,父类的该函数地址被“隐藏”,但是它还可以用父类的类型指针访问得到:用子类类型指针访问该函数,则进

C++中重载、重写(覆盖)和隐藏的区别实例分析

这篇文章主要介绍了C++中重载.重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下 本文实例讲述了C++中重载.重写(覆盖)和隐藏的区别,对于C++面向对象程序设计来说是非常重要的概念.具体分析如下: 1.重载:重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. 示例代码如下: class A{ public: void test(int

C++中成员函数的重载、覆盖和隐藏的区别

转载请注明,原创地址:点击打开链接   http://blog.csdn.net/u010587274/article/details/38928561 个人微信公众号:tanzi_888 (潭子技术圈) C++中成员函数的重载.覆盖和隐藏的区别: 1 重载(overload): 是函数名相同,参数列表不同 重载只是在类的内部存在.但是不能靠返回值类型来判断.1.1)相同的范围(在同一个类中)1.2)函数名字相同1.3)参数不同 1.4)Virtual关键字可有可无 2  覆盖 (overrid

java的重载、覆盖和隐藏的区别

重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义) 3.main方法也是可以被重载的 覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同 两同两小一大  注意:子类实例方法不能覆盖父类的

Nullable<T>、Nullable、null、?修饰符的区别

这章我们讨论一下Nullable<T>.Nullable.null.?修饰符的区别 原创文章 Nullable<T>的前世今生 讨论它们之前,我们有必要讨论一下Nullable<T>的前世今生,目的也是为了让我们更好地了解他们的区别,加深印象. 在C#2以前,有一个问题经常会困扰我们,相信大部分人都想过此问题. 在数据库中,比如设置一个表如下(电脑表Computer) 字段名 类型 是否允许空值 Color varchar Y Age int N CpuSpeed in

重载-重写(覆盖)-隐藏的区别

重载和重写搞的差不多了,隐藏有有点混乱了,在此记一下,留作后看 成员函数被重载的特征(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.重写(覆盖)是指派生类函数覆盖基类函数,--这是c++多态的标志,虚函数赋零则变成虚基类(纯粹的接口申明类),特征是(1)不同的范围(分别位于派生类与基类):(2)函数名字相同:(3)参数相同:(4)基类函数必须有virtual 关键字.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下(1)如果派

out,ref的作用和区别(转载)

ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量.它们的区别是: 1.使用ref型参数时,传入的参数必须先被初始化.对out而言,必须在方法中对其完成初始化. 2.使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字.以满足匹配. 3.out适合用在需要retrun多个返回值

定义c/c++全局变量/常量几种方法的区别(转载)

出自:http://www.cnblogs.com/yaozhongxiao/archive/2010/08/08/1795338.html 在讨论全局变量之前我们先要明白几个基本的概念:  1. 编译单元(模块): 在ide开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误 (link error)  因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用 gcc,makefile等工具在linux或者嵌入

asp.net mvc(模式)和三层架构(BLL、DAL、Model)的联系与区别 转载自:http://blog.csdn.net/luoyeyu1989/article/details/8275866

首先,MVC和三层架构,是不一样的. 三层架构中,DAL(数据访问层).BLL(业务逻辑层).WEB层各司其职,意在职责分离. MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的WEB层,也就是说,MVC把三层架构中的WEB层再度进行了分化,分成了控制器.视图.实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话:而C层直接与三层中的BLL进行对话. 所以, .net的三层结构中,并没有action这个概念. asp.net mvc 是微软新发布