重载与重写

重载与重写

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。相同点都是方法名相同,不同点使用条件方法方面,重写必须有继承,在子类中重写,方法重载在同一个类中。

参数方面:方法重写参数类型、个数、顺序完全一致,而方法重载参数类型、个数、顺序至少一个不一致。

返回类型方面:方法重写方法返回类型必须一致或可协变,而方法重载对返回类型无要求,可以一致或不一致。

次数方面:父类的一个方法只能被一个子类重写一次,而一个类中可以有一个方法的多个重载方法。

权限和异常方面:方法重写对方法的访问权限和抛出的异常有特殊的要求,而方法重载没有限制。

一、定义上的区别:

1、重载

指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。

2、覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。

二、规则上的不同:

1、重载的规则:

①必须具有不同的参数列表。

②可以有不同的访问修饰符。(没要求)

③可以抛出不同的异常。(没要求)

2、重写方法的规则:(必须有继承)

①参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。

②返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。

③访问修饰符的限制一定要大于被重写方法的访问修饰符。

④重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。(异常更少)

三、类的关系上的区别:

重写是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。

四、是否可以根据返回类型来区分重载?

不能。

利用回来值类型来区分重载,很容易发生歧义,举个例子,比如下面两个方法,虽然他们有同样的名字和形式,但却很容易区分它们:Java 代码
void f(){}
int f(){return 1;}

只要编译器可以根据语境明确判断出语义,比如在 int x =f()中,那么的确可以据此却分重载方法。不过,有的时候并不关心方法的返回值,你想要的是方法调用的其他效果,这时你可能会调用方法而忽略其返回值。所以,如果像下面这样调用方法:f();此时 Java 如何才能判断该调用哪一个 f()呢?因此,根据方法的返回值来区分重载方法是行不通的。

posted @ 2021-09-20 18:59  编程丫·  阅读(348)  评论(0编辑  收藏  举报