一、重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。这样才能通过传递不同的参数来决定到底调用哪一个。
值得注意的是,方法重载只有通过参数不同来判断调用哪个方法,而不能通过返回值。至于原因,可以这样理解,你调用一个方法,如果有多个方法同名,系统必须要知道到底你要调用哪一个,参数可以帮助系统在方法入口处得到答案,他根据你给的参数就知道该使用哪个方法。如果只有返回值的不同,很多情况系统是不可能得到有效的判断条件的,比如: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修饰符也将产生警告
分享到:
相关推荐
C#中方法的重写(override)和重载(overload)的区别
主要介绍了java 重载(overload)与重写(override)详解及实例的相关资料,并附实例代码,需要的朋友可以参考下
Java面向对象编程中的重写(override)指的是子类可以重写其父类中的非private方法,使得子类在调用该方法时会使用自己的实现而不是父类的实现。 重写(Override)讲解 定义一个名为 Animal 的父类和一个名为 Cat 的...
此篇文章简单的讲解了java方法的定义,使用方式,然后介绍了java方法的重载,这些在以后的工作中时时刻刻都要用到,可以说java一切功能的实现靠的就是java方法
java
Java中的方法重载(overload)
override and overload difference
发生方法重写的两个方法返回值,方法名,参数列表必须完全一致 3. 子类抛出的异常不能超过父类相应的方法抛出的异常 4. 子类方法的访问级别不能低于父类相应方法的访问级别(public,package,protected, ...
overload and override.txt的区别重载和隐藏的区别
主要介绍了Java重写(Override)与重载(Overload)区别原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java方法重载Overload原理及使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
重载(Overload)是重新加载的意思,指的是同一个类中同名,但是参数列表不同的方法组(返回值不能区别函数是否重载),重载没有关键字。通俗点说重载是对内存中同一个类中的函数或方法进行重新加载的意思。 2、...
本文详细地描述了overload 和override的区别
消息循环重载 message overload
// 下面几个方法用来验证可以通过定义不同的参数类型和参数的数目进行方法重载。 public void fun(){ System.out.println("method fun in OverloadTest, no parameter"); } public void fun(float f) { System...
重载、重写和隐藏三者在编程语言中的定义 重载(overload):函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同。重载既可以发生在同一个类的不同函数之间,也可发生在父类子类的...
Delphi面向对象:overload与override[文].pdf
此题涉及方法重载(overload),方法重写(override)以及类派生时方法重写的规则。方法重载的规则是:一、参数列表必须不同,个数的不同 完全可以,如果个数相同则参数类型的不同不能引起歧意,例如int 和long,...
方法重载(overload)在传统的静态类型语言中是很常见的。JavaScript 作为动态语言, 是没有重载这一说的。一是它的参数没有类型的区分,二是对参数个数也没有检查。虽然语言层面无法自动进行重载,但借助其动态的...
本文实例讲述了PHP模拟一般面向对象语言中的方法重载(overload)。分享给大家供大家参考,具体如下: 在一般的面向对象设计语言(如C++,Java)中的方法重载就是定义相同的方法名,通过“参数的个数”不同或“参数的...