初次看到这两个名词,感觉它们两个有着千丝万缕的联系似的,不过仔细一研究,发现它们的差异还是很大的。
通俗点说,重写就是改头换面,重新做人;重载就是给它加了个兄弟。
下面对比介绍一下重写和重载。
重写的规则:
1.在不同类中(有继承关系的类之间,一般用于派生类)。
2. 重写与被重写方法的相同点:参数列表、返回值、抛出异常,方法名 。
3.重写与被重写方法的不同点:重写方法的访问修饰符>被重写的访问修饰符(public>package>protected>private); 方法体不同。
4.重写的基方法必须是virtual、abstract或override,不能重写非虚方法或静态方法。
override和new区别:
new声明的方法,子类调用,运行子类的函数,而如果类型是基类,被隐藏的基类函数就会被调用。
子类函数使用override,用子类的类型来调用,会运行子类的函数,类是基类的时候,仍会调用子类的函数。
举例:
(源自C#重载和重写的区别)
public abstract class BaseClass//定义一个抽象的虚类
{
public abstract void ShowInfo();//定义虚方法
public virtual void OutInfo()//定义抽象方法
{
Console.WriteLine("这是基类的虚方法!");
}
}
public class SonClass : BaseClass//实现抽象基类BaseClass
{
public override void ShowInfo()//重写基类的抽象方法
{
Console.WriteLine("重写基类的抽象方法");
}
public override void OutInfo()//重写基类的虚方法
{
Console.WriteLine("重写基类的虚方法");
}
}
重载的规则:
1.在同一个类中
2.方法名必须相同
3.参数列表不能相同,返回值可以相同可以不同
4.任何一个父类的函数在其一个子类中只能被重写一次。
举例:
class BillPayment
{
void PayBill(int telephoneNumber)
{
//此方法用于支付固定电话费
}
void PayBill(long consumerNumber)
{
//此方法用于支付电费
}
void PayBill(long consumerNumber, double amount)
{
//此方法用于支付移动电话话费
}
}
感受:
貌似相同,就要找不同点,为了留下深刻的印象;貌似不同,就要找相同点,减少知识量。生活就是学习,学习来源于生活。对学习的知识有一个感性的认识,感性的认识很容易让人接受,铭记,然后通过实践去理解理论,进行总结,最后创新是我们的终极目标。
PS:2015年8月17日
为什么用重写:
子类可以对父类的方法进行重写,让自己拥有父类的属性,方法更加的灵活,实现了多态。
为什么用重载:
方法重载可以再不改变原来方法的基础上,新增功能。提供了函数可扩展的能力。
重写和重载对比:
作用域:重写(父类与子类),重载(方法之间)
特点:重写(方法名相同) ,重载(方法名相同,参数不同)