在面向对象基础中我们提到了方法重载,那么我们必然也听到过方法重写,那你对这两个方法知道多少呢?方法重写和方法重载的区别又是什么呢?下面让我们来分析一下。
方法重写(override)
概念
重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变,即外壳不变,核心重写
好处
子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法
注意
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常
例如:父类的一个方法申明了一个检查异常IOExecption,但是在重写这个方法的时候不能抛出Exception异常,因为Exception是IOExecption的父类,只能抛出IOException的子类异常
重写规则
- 参数列表必须完全与被重写方法的相同
- 返回类型必须完全与被重写方法的返回类型相同
- 访问权限不能比父类中被重写的方法的访问权限更低。如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected
- 父类的成员方法只能被它的子类重写
- 声明为static的方法不能被重写,但是能够被再次声明
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法
- 构造方法不能被重写
- 如果不能继承一个方法,则不能重写这个方法
举例
1. class Animal 2. { 3. protected string name = ""; 4. public Animal (string name) 5. { 6. this.name = name; 7. } 8. protected int shoutNum = 3; 9. public virtual string Shout() 10. { 11. string result = ""; 12. for (int i = 0; i < shoutNum ; i++) 13. { 14. result += "啊"; 15. } 16. return "我的名字叫" + name + " "; 17. } 18. } 19. class Cat : Animal 20. { 21. public Cat(string name) : base(name) { } 22. 23. public override string Shout() 24. { 25. return "我的名字叫" + name + " "; 26. } 27. }
方法重载
概念
重载是在一个类里面,方法名字相同,而参数不同,返回类型可以相同也可以不同
好处
方法重载可以在不改变原方法的基础上,新增功能
注意
并不是只有构造方法可以重载,普通方法也可以重载
两个方法必须要方法相同,但参数类型或个数必须要有所不同
重载规则
- 被重载的方法必须改变参数列表(参数个数或类型或顺序不一样)
- 被重载的方法可以改变返回类型
- 被重载的方法可以改变访问修饰符
- 方法能够在同一类中或者在一个子类中被重载
举例
1. class Cat 2. { 3. private string name = ""; 4. public Cat(string name) 5. { 6. this.name = name; 7. } 8. public Cat() //将构造方法重载 9. { 10. this.name = "无名"; 11. } 12. public string Shout() 13. { 14. return "我的名字叫" + name + "喵"; 15. } 16. }
重写与重载直接的区别
总结
方法重载和方法重写是多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
1、方法重载是一个类中定义了多个方法名相同,而它们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载
2、方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,称为方法的重写
3、方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现
图解