【大话设计模式】方法重写和方法重载的区别

简介: 【大话设计模式】方法重写和方法重载的区别

面向对象基础中我们提到了方法重载,那么我们必然也听到过方法重写,那你对这两个方法知道多少呢?方法重写和方法重载的区别又是什么呢?下面让我们来分析一下。

方法重写(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、方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现

图解


相关文章
|
22天前
|
设计模式 API
【设计模式】适配器和桥接器模式有什么区别
【设计模式】适配器和桥接器模式有什么区别
26 1
|
22天前
|
设计模式 算法
设计模式思考,简单工厂模式和策略模式的区别?
设计模式思考,简单工厂模式和策略模式的区别?
|
22天前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
|
22天前
|
设计模式 Java 数据库连接
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。那么三者有什么区别呢?
110 1
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
|
22天前
|
设计模式
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
|
12月前
|
设计模式 uml
设计模式中工厂方法与抽象工厂之间的区别联系
设计模式中工厂方法与抽象工厂之间的区别联系
54 0
|
设计模式 算法 API
常用设计模式的功能、关联和区别
常用设计模式的功能、关联和区别
|
设计模式
【重温设计模式】——从工厂方法模式看抽象类和接口的区别
【重温设计模式】——从工厂方法模式看抽象类和接口的区别
98 0
【重温设计模式】——从工厂方法模式看抽象类和接口的区别
|
设计模式 XML 存储
vue相关面试题:MVC,MVP,MVVP三种设计模式的区别
patch 阶段根据 VNode 创建真实节点树,核心方法为 createElm,首先遇到组件类型的 VNode,内部会执行 $mount,再走一遍相同的流程。普通节点类型则创建一个真实节点,如果它有子节点开始递归调用 createElm,使用 insert 插入子节点,直到没有子节点就填充内容节点。最后递归完成后,同样也是使用 insert 将整个节点树插入到页面中,再将旧的根节点移除。
169 0
|
设计模式 数据安全/隐私保护
设计模式与范式 --- 适配器模式、装饰器模式与代理模式的区别与联系
设计模式与范式 --- 适配器模式、装饰器模式与代理模式的区别与联系
设计模式与范式 --- 适配器模式、装饰器模式与代理模式的区别与联系