一、重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。这样才能通过传递不同的参数来决定到底调用哪一个。

值得注意的是,方法重载只有通过参数不同来判断调用哪个方法,而不能通过返回值。至于原因,可以这样理解,你调用一个方法,如果有多个方法同名,系统必须要知道到底你要调用哪一个,参数可以帮助系统在方法入口处得到答案,他根据你给的参数就知道该使用哪个方法。如果只有返回值的不同,很多情况系统是不可能得到有效的判断条件的,比如:double method();int method();如果你这样调用:method()。系统当然不知道该调用哪个。

示例:

//返回值相同,参数不同

 class  BillPayment{void PayBill(int TelephoneNumber){//此方法用于支付固定电话费}void PayBill(long CustomerNumber){//此方法用于支付电费}void PayBill(long CustomerNumber,double amount){//次方法用于支付移动电话费}}
}

//返回值相同,参数个数不同

class Add
{int addtion(int num1,int num2){return num1+num2;}int addtion(int num1,int num2,int num3){returnnum1+num2+num3;}
}

//参数不同,返回值不同

int Method(int[] numbers)
{
}
double Method(double[] numbers)
{
}

注:泛型出现后,相同参数,相同返回值的方法也能构成重载,这里不介绍。

二、重写:继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的,即方法名,参数,返回值都相同。

例如:基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.

重写override一般用于接口实现和继承类的方法改写,要注意:

1、覆盖的方法的标志必须要和被覆盖的方法的名字和参数完全匹配,才能达到覆盖的效果;

2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

示例:

namespace 方法重写
{class Program{static voidMain(string[] args){BaseClass CO =new ClassOverride();CO.SetName("Override");}
//基类public classBaseClass{public virtualvoid SetName(string name){Console.WriteLine("基类:我的名字是" + name);}}//派生类public classClassOverride : BaseClass{publicoverride void SetName(string name){Console.WriteLine("Override:我的名字是" + name);}}}
}

在方法重写中,我们介绍了虚方法,那么虚方法和抽象方法有什么区别呢?

1.虚方法有一个实现部分可以被子类继承,从而使子类获得和基类相同的方法,另外也为派生类提供了覆盖该方法的选项。相反,抽象方法没有提供实现部分,是一种强制派生类覆盖的方法(否则派生类不能成具体类)

2.(abstract)抽象方法只能在抽象类中声明,(virtual)虚方法不是。

3.(abstract)抽象方法必须在派生类中重写而(virtual)虚方法不必。

4.(abstract)抽象方法不能声明方法实体,虚方法可以。

个人感觉,方法重载和方法重写都有点像多态,同一个方法的多种形态:执行“相同”的方法,却通过它们自己的实现代码来实现,即同一种方法,不同的对象会产生不同的结果。

三、隐藏(方法):基类方法不做申明(默认为非虚方法),在派生类中使用new声明此方法的隐藏。隐藏时,访问父类则调用父类的方法,访问子类则调用子类的方法。

示例:

namespace 隐藏
{class Program{static voidMain(string[] args){ClassNew CN =new ClassNew();CN.SetName("new");BaseClass BC =CN;BC.SetName("基类");}//基类public classBaseClass{public voidSetName(string name){Console.WriteLine("基类:我的名字是" + name);}}
//派生类public classClassNew : BaseClass{//这里如果不使用new,将生成警告!new publicvoid SetName(string name){Console.WriteLine("new:我的名字是" + name);}}}
}

运行结果:new:我的名字是new

基类:我的名字是基类

如果上述扔不好理解,我们再举一个隐藏静态变量的例子

namespace 隐藏继承成员
{class Program{public classBaseClass{public static int A = 123;}public classClassNew : BaseClass{new public static int A = 456;static voidMain(string[] args){Console.WriteLine(A);}}}
}

运行结果:456

注:不仅有方法隐藏,还有其他的,通过继承隐藏名称一般采用下列形式之一:

1.引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。

2.引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。

3.引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。

4.在同一成员上同时使用 new 和 override 是错误的。

另外,在不隐藏继承成员的声明中使用 new 修饰符将生成警告。在隐藏继承成员的生命中不使用new修饰符也将产生警告

转载于:https://www.cnblogs.com/javaspring/archive/2011/09/15/2656609.html

C#方法重载(overload)方法重写(override)隐藏(new)相关推荐

  1. 重载Overload 和重写Override区别

    重载Overload 和重写Override区别 一.含义 二.代码 1.重载OverLoad 2.重写Override 一.含义 重载OverLoad:表示同一个类中的可以有多个方法名称相同的方法, ...

  2. c语言 方法重载 冲定义,C++ 重载(overload)、重写(overrride)、重定义(redefine)

    今天参加了一个面试,问到了上面的C++知识点,都知道,时间久了难免遗忘,感觉回答的一般,不够专业,部分点还答错了,sigh!在此再补漏下. 注意:这些都是C++语言的特性,C语言连最简单的重载(ove ...

  3. C++多态及重载(overload),覆盖(override),隐藏(hide)的区别

    转自 Hackbuteer1 http://blog.csdn.net/hackbuteer1/article/details/7475622 C++编程语言是一款应用广泛,支持多种程序设计的计算机编 ...

  4. 【C++专题】重载(overload)、覆盖(override)、隐藏(hide) 辨析

    写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的, ...

  5. C++ 重载(overload)、重写(overrride)、重定义(redefine)总结

    昨晚打开论坛,看到有朋友问了一个关于虚函数的问题,因为头太疼了,所以今天中午起床再看. 问题传送门:http://www.cppleyuan.com/viewthread.php?tid=7923 C ...

  6. 方法重载,new,override

    方法重载:参数列表不一样,方法名字一样,包括泛型,和返回值无关 new: 复写,方法重载   overload  继承是对于普通方法和属性  复写 父类的 override:覆盖,重写 ,  对于抽象 ...

  7. 【JVM系列3】方法重载和方法重写原理分析,看完这篇终于彻底搞懂了

    深入分析Java虚拟机中方法执行流程及方法重载和方法重写原理 前言 思考 栈帧 局部变量表(Local Variables) 操作数栈(Operand Stacks) 动态连接(Dynamic Lin ...

  8. 方法重载和方法重写的区别和作用

    一.方法重载(Overload) 背景: 有时我们要用到一个函数同时兼容多种类型或者参数的情况,这时我们就要用到方法重载. 含义: 一个方法的逻辑是一样的,但是考虑到要适用不同的场景(参数个数不同,参 ...

  9. JAVA SE、EE、ME,JRE、JDK,基本数据类型,访问修饰符、函数、封装的概念、UML类图、构造方法、this关键字、static关键字、方法重载、方法重写、包(packahe)

    运行第一个JAVA程序: 这里使用的开发环境是eclipse,新建一个java工程,然后可以看到src这个是存放java代码的地方,然后在src文件右击新建一个class(类),然后可以看到下图,同样 ...

  10. Java中方法重载和方法重写的区别

    文章目录 1 Java中方法重载和方法重写的区别 1 Java中方法重载和方法重写的区别 主要区别如下: 方法重载: 在同一个类中 方法名相同 参数个数.顺序.类型不同 返回值类型.访问修饰符任意 方 ...

最新文章

  1. 洛阳综合保税区正式获国务院批复同意设立
  2. C#开发教程初级-第一天-hello Word 控制台编程
  3. python的文件基本操作和文件指针
  4. 解决: Client does not support authentication protocol requested by server; consider upgrading MySQL
  5. 机器学习的重新思考:人工智能如何学习“失忆”?
  6. python-文件操作(1)
  7. IBM MQ 创建以及常见问题
  8. 批量关停azure vm_如何在Azure中使用Visual Studio和VM数据库
  9. 机器视觉光源之LED光源
  10. 克隆硬盘后进不去系统_Windows 10克隆后ssd硬盘不能引导启动
  11. JAVA缴税_根据工资和税率计算应缴税(java)
  12. PTA 7-55 剿灭魔教 (30分)(拓扑排序bfs版)
  13. 淮安万达机器人_淮安万博机器人 万达上班时间【输入网址YB7888.vip】angmi_PP视频搜索-PP视频-原PPTV聚力视频...
  14. H5 canvas 画圆 画圆角
  15. 【XMind学习笔记02】 你不得不知的5大功能
  16. 什么是HashMap?
  17. 图像处理——人脸黑头检测+用户界面
  18. 如果恢复计算机系统时间吗,一般的计算机还原系统需要多长时间?
  19. 正负用c语言表示,用C表示负数?
  20. VL综述:视觉-语言智能:任务、表征学习、大模型

热门文章

  1. android优化最强软件,最强大的安卓优化工具诞生,让手机流畅度提升75%
  2. linux课程_linux系统使用课程更新提示
  3. java学习笔记2022.1.15
  4. 搜索二维矩阵 II—leetcode240
  5. 迅雷启动不了,提示Atl71.dll文件丢失
  6. C语言:函数中参数的传值与传地址
  7. 成绩管理单链表文件c语言,c语言学生信息管理完整.docx
  8. 排序算法——直接插入排序
  9. c++ 标准库中 cin.ignore()
  10. android怎么实现标题搜索,Android Toolbar上SearchView的实现