Java之路:方法重载与重写的区别

一、方法的重载(overload)

方法名相同但参数列表不同的方法签名机制,称之为方法的重载(method overload)。

重载的表现形式就是调用一系列具有相同名称的方法,这些方法可根据传入参数的不同而得到不同的处理结果,这其实就是多态性的一种体现,这属于静态多态,即同一种接口,不同的实现方式。 这种多态是在代码编译阶段就确定下来的。

(1)方法名称相同。

(2)方法的参数列表不同(参数个数、参数类型、参数顺序,至少有一项不同)。

(3)方法的返回值类型和修饰符不做要求,可以相同,也可以不同。无法以返回型别作为重载函数的区分标准。

(4)方法的签名仅包括方法名称和形参,因此方法重载不能根据方法的不同返回值来区分不同方法,因为返回值不属于方法签名的一部分。

(5)在重载的关系之中,返回值类型可以不同,语法上没有错误,但是从实际的应用而言,建议,返回值类型相同。

(6)重载只发生在一个类中。

例如,int add(int, int)和void add(int, int)的方法签名是相同的,编译器会“认为”这两个方法完全相同而无法区分,故此它们无法达到重载的目的。

二、方法的重写(override)

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写

重写也是一种多态形式,在程序运行阶段才能体现出来,这种方式称为动态联编,也称为晚期联编(late bingding)。

(1)重写发生在父类与子类之间。

(2)返回类型、参数列表必须完全与被重写方法的相同。

(3)重写访问权限不能比父类中被重写的方法的访问权限更低。 例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。

(4)构造方法不能被重写。

(5)声明为final的方法不能被重写。

(6)声明为static的方法不可以被重写。 如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写

(7)子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。

(8)子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。

三、重载与重写的比较

在这里插入图片描述

面试题:重载(Overload)和重写(Override)的区别?

答:方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性,而重写实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值