方法的重载
(
overload
)和覆盖
(
override
)
有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数。例如我
们最常用的
System.out.println()
能够打印出任何数据类型的数据,它有多种实现方式。运行时,
Java
虚拟机先判断给定参数的类型,然后决
定执行哪个
println()
方法。
重载(
overload
):对于类的方法(包括从父类中继承的方法),方法名相同
,参数列表不同
的方法之间就构成了重载关系。这里有两个问题需要注意:
(1)
什么叫参数列表?参数列表又叫参数签名,指三样东西:参数的类型
,参数的个数
,参数的顺序
。这三者只要有一个不同就叫做参数列表不同。
(2)
重载关系只能发生在同一个类中吗?非也。这时候你要深刻理解继承,要知道一个子类所拥有的成员除了自己显式写出来的以外,还有父类遗传下来的。
所以子类中的某个方法和父类中继承下来的方法
也可以发生重载的关系。
大家在使用的时候要紧扣定义
,看方法之间是否是重载关系,不用管
方法的修饰符和返回类型以及抛出的异常,只看方法名和参数列表。而且要记住,构造器也可以重载。
覆盖
(override)
:也叫重写,就是在当父类中的某些方法不能满足要求时,子类中改写父类的方法。当父类中的方法被覆
盖了后,除非用
super
关键字,否则就无法再调用父类中的方法了。
发生覆盖的条件:
1
、“三同一不低
”
子类和父类的方法名称
,参数列表
,返回类型
必须完全相同
,而且子类方法的访问修饰符的权限不能比父类低
。
2
、子类方法不能抛出比父类方法更多的异常
。即子类方法所抛出的异
常必须和父类方法所抛出的异常一致
,或者是其子类
,或者什么
也不抛出
;
3
、被覆盖的方法不能是
final
类型的。因为
final
修饰的方法是无法覆盖的。
4
、被覆盖的方法不能为
private
。否则在其子类中只是
新定义了一个方法,并没有对其进行覆盖。
5
、被覆盖的方法不能为
static
。所以如果父类中的方法
为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误。反之亦然。即使父类和子类中的方法都是静态的,
并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
方法的覆盖和重载具有以下相同点:
都要求方法同名
都可以用于抽象方法和非抽象方法之间
方法的覆盖和重载具有以下不同点:
方法覆盖要求参数列表(参数签名)必须一致,而方法重载要求参数列表必须不一致。
方法覆盖要求返回类型必须一致,方法重载对此没有要求。
方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方
法)
方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。
另外,对于属性(成员变量)而言,是不能重载的,只能覆盖。
分享到:
相关推荐
一个技术文档,记录一些关于C++方面的函数的重载和覆盖方法,可供参考
函数重载和覆盖的 区别 函数重载和覆盖
JAVA的重载和覆盖(论文)
java中的方法重载和覆盖的区别宣贯.pdf
类成员函数的重载、覆盖和隐藏区别以及抽象类等
下面小编就为大家带来一篇深入理解java中的重载和覆盖。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
方法的重载与覆盖 发生重载的条件: 1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int, float), ...
java中函数重载与覆盖的例子,person类和teacher类
重载、覆盖和隐藏
Java语言中的覆盖重载和多态,方法的多态,类型的多态,多态的优点,覆盖(override)识别标志,方法的重载,构造函数的重载,重载的好处,重载与覆盖的比较,编译时多态和运行时多态
这篇文章主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下
重载,重写,覆盖,多态的深刻剖析,具体分析了重载,重写,覆盖,多态之间的区别
要弄清楚重载、覆盖、多态与函数隐藏之间的复杂且微妙关系。这是C++基本功,几个概念容易混淆,易于掌握,要多运用。
这是我在网上找的一些Java试题,对初学Java语言的人有帮助
文件详细描述了C++成员函数的重载、覆盖与隐藏技术,对于初学C++的人员很有帮准,也是我们程序猿参考、学习的重要资料。
这个PPT详细展示了java的多态重载和重写,展示了重载和覆盖的不同点及区别办法
(2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。 (3)子类函数的访问...
DELPHI中方法的类型及其覆盖、重载 1、静态方法是方法的缺省类型,对它就像对通常的过程和函数那样调用,编译器知道这些方法的地址,所以调用一个静态方法时它能把运行信息静态地链接进可执行文件,所以,静态方法...
覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。 c.“隐藏”是指派生类的函数屏蔽了与其同名的基类...
Delphi--抽象方法、重载、覆盖。继承实例Delphi--抽象方法、重载、覆盖。继承实例