实例讲解override和new的区别

一、override:Override关键字主要是提供派生类对基类方法的新实现。

1、不可以用于重写非虚方法和静态方法

2、与其配套使用的关键字是Virtual、abstract、Override

3、不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。


 

二、new:new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。

可以对基类的虚方法、普通方法进行操作


三、Virtual:允许在派生类中重写这些对象,默认情况下,方法是非虚拟的,不可以重写。virtual关键字不可以与static、abstract、private、override一起使用。Virtual关键字和override紧密不可分的,如果要实现Virtual方法就必须要使用override或new关键字(new和override产生的机理不同)。


四、下面一个小例子进行讲解,耐心看完,一目了然。

class A 
{ 
public virtual void Func() // 注意virtual,表明这是一个虚拟函数 
{ 
Console.WriteLine("Func In A"); 
} 
} 
class B : A // 注意B是从A类继承,所以A是父类,B是子类 
{ 
public override void Func() // 注意override ,表明重新实现了虚函数 
{ 
Console.WriteLine("Func In B"); 
} 
} 
class C : B // 注意C是从B类继承,所以B是父类,C是子类 
{ 
} 
class D : A // 注意D是从A类继承,所以A是父类,D是子类 
{ 
public new void Func() // 注意new ,表明覆盖父类里的同名类,而不是重新实现 
{ 
Console.WriteLine("Func In D"); 
} 
} 
class Program 
{ 
static void Main(string[] args) 
{ 
A a; // 定义一个a这个A类的对象.这个A就是a的申明类 
A b; // 定义一个b这个A类的对象.这个A就是b的申明类 
A c; // 定义一个c这个A类的对象.这个A就是c的申明类 
A d; // 定义一个d这个A类的对象.这个A就是d的申明类 
a = new A(); // 实例化a对象,A是a的实例类 
b = new B(); // 实例化b对象,B是b的实例类 
c = new C(); // 实例化c对象,C是c的实例类 
d = new D(); // 实例化d对象,D是d的实例类 
a.Func(); // 执行a.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类A,就为本身 4.执行实例类A中的方法 5.输出结果 Func In A 
b.Func(); // 执行b.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类B,有重载的 4.执行实例类B中的方法 5.输出结果 Func In B 
c.Func(); // 执行c.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类C,无重载的 4.转去检查类C的父类B,有重载的 5.执行父类B中的Func方法 5.输出结果 Func In B 
d.Func(); // 执行d.Func:1.先检查申明类A 2.检查到是虚拟方法 3.转去检查实例类D,无重载的(这个地方要注意了,虽然D里有实现Func(),但没有使用override关键字,所以不会被认为是重载) 4.转去检查类D的父类A,就为本身 5.执行父类A中的Func方法 5.输出结果 Func In A 
D d1 = new D(); 
d1.Func(); // 执行D类里的Func(),输出结果 Func In D 
Console.ReadLine(); 
} 
} 

 

 1、首先检查的都是申明类

2、如果申明类是虚方法,则去检查实例类

3、如果实例类没实现,则使用父类中的虚方法。(优先级最后)

4、new的时候,虽然继承类中也有同名方法,但是已经与父类那个没有关系。故也不会调用到这个方法。除非是以子类申明的对象才能调用的到。

 

转载于:https://www.cnblogs.com/xyang/archive/2012/05/08/2490092.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql报错5_mysql5.5 启动报错:ERROR!_MySQL

bitsCN.com在FreeBSD中启动mysql时报错,ERROR! The server quit without updating PID file,通常这是可以查看数据库目录下的.err日志,里面会记录一些具体的错误信息,对排错相当有用,内容如下:110805 17:30…

MySQL安装总结

安装MySQL:(以安装5.1版本为例) 1. 双击你下载的安装程序,然后会进入一个‘Welecom to the Setup Wizard for MySQL Server 5.1’的图形界面!在这里不用做任何操作,点击next,进入下一步&a…

java swing事件_第四节 Java Swing事件处理

第四节:事件处理一个图形界面完的成只是程序开发中起步的工作,因为要想让每一个组件都发挥其作用,就必须对所有的组件进行事件处理。那么什么是事件处理,所谓事件就表示一个对象发生状态变化。例如,每当按下一个按钮时…

jedate-开始使用一款好用的时间插件

jeDate日期控件 -(原生JS版)jeDate V6.5.0 是一款原生JS开发的 不依赖任何第三方库 大众化的日期控件,包含 多语言、设定年月(YYYY-MM)、日期范围限制、开始日期设定、自定义日期格式、根据不同的日期格式,…

我们买得起nook,kindle fire可我们买不起书啊

BARNES & NOBLE | Bring Up the Bodies by Hilary Mantel, Holt, Henry & Company, Inc. | NOOK Book (eBook), Hardcover, AudiobookBarnsnobles

java 验证码 插件_javaweb中验证码插件Kaptcha的使用

1.首先在pom.xml中导入依赖com.github.pengglekaptcha2.3.22.在web.xml中设置Kaptchacom.google.code.kaptcha.servlet.KaptchaServletkaptcha.bordernokaptcha.textproducer.font.colorredkaptcha.image.width135kaptcha.textproducer.char.stringACDEFHKPRSTWX345679kaptcha.…

zabbix的安装(一)监控os资源:内存,cpu,io,负载,带宽

一、Linux下开源监控系统简单介绍1)cacti:存储数据能力强,报警性能差2)nagios:报警性能差,存储数据仅有简单的一段可以判断是否在合理范围内的数据长度,储存在内存中。比如,连续采样…

linux下rpm方式安装mysql(2012-5-12)

由于感觉前几篇博客中关于linux下rpm方式安装mysql的方法问题太多,今天抽时间重新实践和整理了一下,现在拿出来和大家分享,希望对家有用。 系统环境:Rat had enterprise linux server 6.1MySQL-5.5.22-1.linux2.6.i386VMware Work…

list java语法_java基础语法 List

List的用法List包括List接口以及List接口的所有实现类。因为List接口实现了Collection接口,所以List接口拥有Collection接口提供的所有常用方法,又因为List是列表类型,所以List接口还提供了一些适合于自身的常用方法,如表1所示。表…

基础练习

口述题1.分别解释"","",""的含义。 是赋值语句 把一个值赋值给另一个值 是判断语句 判断两个值是否相等 是赋值语句 a1 等价于 aa1 2.两个变量的关系?n1123456n2n1 把123456赋值给变量n1,把n2赋值给n1,n1,n2共同指向123456这个地址 …

求大神解决下这个题目!做好请发到308960728@qq.com

RIP动态路由配置RIP是使用最广泛的距离向量协议,通过本次配置来理解RIP协议的传播、分析、挑选路由,来实现路由发现、路由选择、路由切换等功能,掌握RIP动态路由信息协议的配置方法。1.RIP配置环境与网络拓扑结构图实验设备:3台CI…

java获取response数据_Java中实现Http请求并获取响应数据

前言 在演示的功能代码中使用的请求http地址为:http://timor.tech/api/holiday/year/ 接口说明:获取指定年份或年月份的所有节假日信息。默认返回当前年份的所有信息。 以上功能代码仅在使用GET请求方式时测试通过,POST等其他请求时请自行尝试。 因未设置请求头时也成功获取…

ubuntu16.04 编译出错:fatal error: SDL/SDL.h: No such file or directory

在ubuntu 16.04编译神经网络代码时候,遇到了这样一种错误? fatal error: SDL/SDL.h: No such file or directory 原因是SDL库没有安装,根据你使用的是SDL1还是SDL2来进行不同的安装:如下所示: SDL2 sudo apt-get insta…

在你的 iOS App中 使用 OpenSSL 库 转发

在你的 iOS App中 使用 OpenSSL 库 转发 英文原文链接:http://www.x2on.de/2010/07/13/tutorial-iphone-app-with-compiled-openssl-1-0-0a-library/下文有错误 参照有风险:需要修改 输入命令行的部分 建议用英文原版里的!!&#…

elastic search java_在 Java 应用程序中使用 Elasticsearch

如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣。尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsearch 项目背后的动机。Elasticsearch(构建于 Lucene 之上)在一个容易管理的包中提供了高性能的全文…

PostgreSQL增强版命令行客户端(pgcli)

效果: 安装: https://www.pgcli.com/install 官网: https://www.pgcli.com/ 转载于:https://www.cnblogs.com/EasonJim/p/9042418.html

网络设备的注册与初始化

2019独角兽企业重金招聘Python工程师标准>>> NIC可用之前,其相关联的net_device数据结构必须先初始化,添加到内核网络设备数据库、配置并开启。不要把注册/除名以及开启/关闭混淆是十分重要的,这是两种不同的概念: 如果…

java jdbc reparecall_Java Connection.prepareCall方法代碼示例

本文整理匯總了Java中java.sql.Connection.prepareCall方法的典型用法代碼示例。如果您正苦於以下問題:Java Connection.prepareCall方法的具體用法?Java Connection.prepareCall怎麽用?Java Connection.prepareCall使用的例子?那…

Vue提供操作DOM的方法

<div ref"wrapper"> Vue.js 提供了我们一个获取 DOM 对象的接口—— vm.$refs。在这里&#xff0c;我们通过了 this.$refs.wrapper访问到了这个 DOM 对象&#xff0c;并且我们在 mounted 这个钩子函数里&#xff0c;this.$nextTick 的回调函数中初始化 因为 V…

[转]敏捷开发中编写高质量Java代码

本文转自&#xff1a;http://dev.yesky.com/103/11164603.shtml 敏捷开发的理念已经流行了很长的时间&#xff0c;在敏捷开发中的开发迭代阶段中&#xff0c;我们可以通过五个步骤&#xff0c;来有效的提高整个项目的代码质量。 Java项目开发过程中&#xff0c;由于开发人员的…