`
isiqi
  • 浏览: 16043617 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

方法重载、重写、隐藏(new)的区别

 
阅读更多
这三个动词看起来没有多大的区别,很多人也都很混淆这三个方法,粗略的认为他们可以理解成一个意思,其实他们有着本质的区别,下面就来看看他们的不同之处吧!
 方法重载;
  在一个类中允许有几个同名的方法,前提是,这些同名方法必须有不同的调用参数(参数个数不同、参数类型不同),这样的好处是可以根据传递参数的不同来调用同一个类中的不同方法。
  举个例子,最简单的一个求和Sum()方法,当传递两个参数的话就调用有两个参数的Sum()方法,当传递三个参数的话就调用含有三个参数的Sum()方法。
   public double Sum(int num1,int num2)
   {
     return num1+num2;
   }
   public double Sum(int num1,int num2,int num3)
   {
     return num1+num2+num3;
   }
 这就是方法重载,方法重载在构造函数中用的比较多。


方法重写(virtual,override):
方法重写一般用在继承的虚方法中,方法重写的目的是现实多态,当在基类中有一个方法,而想在派生类中覆盖它时,应该把基类中的方子法声明为virtual的,他的含义是让派生类具有同样名字和参数表示的方法被调用,而不是调用基类中的子方法。而在派生类中声明次方法的时候必须用override关键字声明。
 举个最简单的例子:
 有一个People父类,他有一个GuoJI()方法,默认情况下他显示是一个中国人,而有一个American子类继承People父类,在继承GuoJi()这个方法就有点不合逻辑了,所以他就需要重写这个方法:
Class People
{
public virtual void GuoJi()
{
Console.WriteLine("大家好,我来自中国!");
}
}
Class American:People
{
public override void GuoJi()
{
Console.WriteLine("大家好,我来自美国!");
}
}
 这样的话在主函数的入口处:
People p1=new People();
p1.GuoJi();

People p2=new American();
p2.GuoJi();//调用父类中有的虚方法(实质在子类中对这一方法进行了重写)
Console.Readkey();

 运行后的显示结果是:
大家好,我来自中国!
大家好,我来自美国!

隐藏(new关键字):
上面方法重写中,当不能把基类中的方法声明为Virtual时,可以用另一种方法来实现上面例子中的功能,那就是在派生类中声明方法时使用new关键字,从而有效的隐藏基类中的同一名字的方法(次方法与参数无关)。
这种方式不叫重写,子类跟父类中的同名方法因为new这一关键字的关系而没有半毛钱的联系,所以子类可以调用自己类中的这一方法而不会被基类中的同名方法所干扰。
(需要注意的是,new关键字不可以用在抽象类中,因为抽象类中的抽象方法必须重写)
还是上面的那个例子,我们来看一下用new的实现方法:
Class People
{
public void GuoJi()
{
Console.WriteLine("大家好,我来自中国!");
}
}
Class American:People
{
public new void GuoJi()//用new关键字来隐藏父类中的同名方法
{
Console.WriteLine("大家好,我来自美国!");
}
}
 这样的话在主函数的入口处:
People p1=new People();
p1.GuoJi();

American p2=new American();//这里不能用People p2=new American();
p2.GuoJi();//注意这里调用的GuoJI()方法是子类自己的,不属于父类。
Console.Readkey();

  运行后的显示结果是:
   大家好,我来自中国!
   大家好,我来自美国!
   所以呢以后在遇到关于方法重载、方法重写、隐藏(new)时多少应该知道个123了吧。

分享到:
评论

相关推荐

    计算机(专升本)Java程序设计复习资料.doc

    方法的重载和覆盖(重写)有什么区别? 3. 简述抽象类与接口的异同。 4. 简述JDBC访问数据库的步骤。 二、编程题 1. 定义一个类Circle,计算并输出圆(半径=3)的面积 2. 在D盘创建文件test.txt,文件中的内容为...

    C++编程思想习题

    12.5.2为一个类重载new和delete 12.5.3为数组重载new和delete 12.5.4构造函数调用 12.5.5对象放置 12.6小结 12.7练习 第13章 继承和组合 13.1组合语法 13.2继承语法 13.3构造函数的初始化表达式表 13.3.1成员对象...

    C#语言规范(4.0版本)

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    微软C#语言规范,C#语言教程中文版

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    C#语言规范4.0

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    C#_语言规范_4.0_中文版

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    net学习笔记及其他代码应用

    5.override与重载的区别 答 : override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要 Override 是进行基类中函数的重写。为了适应需要。 6.如果在一个B/S结构的系统...

    C#语言规范(2.0,3.0,4.0合集)

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    【04-面向对象(上)】

    •构造器的重载和方法的重载一样,都是方法名相同,形参列表不相同。 •在构造器中可通过this来调用另外一个重载的构造器。 继承的特点 •Java通过关键字extends来实现,实现继承的类称为子类,被继承的...

    ASP.NET开发实战1200例(第Ⅰ卷)第三章

    实例094 关于成员隐藏(使用New关键字 实现) 148 3.5 面向对象编程高级应用 150 实例095 拆装箱终结者——泛型 150 实例096 定制循环——实现迭代器 152 实例097 实现IDisposable接口释放占有资源 153 实例098 对象...

    【05-面向对象(下)】

    •final 修饰的方法仅仅是不能重写,但它完全可以被重载。 •final 修饰的类不可以被继承 不可变的类 •不可变的类要满足以下几个条件:  –1.使用private和final修饰符来修饰该类的属性  –2....

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    由于对构造方法可以进行重写 ,所以通过给出不同个数或类型的参数会分别调用不同的构造方法。 例子:以类 Rectangle 为例,我们生成类 Rectangle 的对象: Rectangle p1=new Rectangle (); Rectangle p2=new Rectangle...

    3Java SE(下).doc

    是一个接口,本身不能实例化,我们需要定义一个类实现该接口,并重写其定义的accept方法来定义过滤规则。 accept方法用于定义过滤要求,当给定的file对象满足要求就返回true即可。 重载的listFiles方法: ...

    C#教程(语言规范)

    7.6.10 new 运算符 ... 149 7.6.10.1 对象创建表达式 ... 149 7.6.10.2 对象初始值设定项 . 150 7.6.10.3 集合初始值设定项 . 152 7.6.10.4 数组创建表达式 ... 153 目录 7.6.10.5 委托创建表达式 ... 155 ...

    asp.net面试题

    拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚. 4.列举一下你所了解的XML技术及其应用 答:XML可是好东西,保存配置,站与站之间的交流,WEB SERVICE都要用它...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

    与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。  gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    面试题6:简述类成员函数的重写、重载和隐藏的区别 面试题7:简述多态实现的原理 第10章 数据结构 10.1 链表 面试题1:链表和数组有什么区别 面试题2:寻找单链表中间结点 面试题3:怎样把一个单链表反序 10.2 单...

Global site tag (gtag.js) - Google Analytics