方法的重载
(
overload
)和覆盖
(
override
)
有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数。例如我
们最常用的
System.out.println()
能够打印出任何数据类型的数据,它有多种实现方式。运行时,
Java
虚拟机先判断给定参数的类型,然后决
定执行哪个
println()
方法。
重载(
overload
):对于类的方法(包括从父类中继承的方法),方法名相同
,参数列表不同
的方法之间就构成了重载关系。这里有两个问题需要注意:
(1)
什么叫参数列表?参数列表又叫参数签名,指三样东西:参数的类型
,参数的个数
,参数的顺序
。这三者只要有一个不同就叫做参数列表不同。
(2)
重载关系只能发生在同一个类中吗?非也。这时候你要深刻理解继承,要知道一个子类所拥有的成员除了自己显式写出来的以外,还有父类遗传下来的。
所以子类中的某个方法和父类中继承下来的方法
也可以发生重载的关系。
大家在使用的时候要紧扣定义
,看方法之间是否是重载关系,不用管
方法的修饰符和返回类型以及抛出的异常,只看方法名和参数列表。而且要记住,构造器也可以重载。
覆盖
(override)
:也叫重写,就是在当父类中的某些方法不能满足要求时,子类中改写父类的方法。当父类中的方法被覆
盖了后,除非用
super
关键字,否则就无法再调用父类中的方法了。
发生覆盖的条件:
1
、“三同一不低
”
子类和父类的方法名称
,参数列表
,返回类型
必须完全相同
,而且子类方法的访问修饰符的权限不能比父类低
。
2
、子类方法不能抛出比父类方法更多的异常
。即子类方法所抛出的异
常必须和父类方法所抛出的异常一致
,或者是其子类
,或者什么
也不抛出
;
3
、被覆盖的方法不能是
final
类型的。因为
final
修饰的方法是无法覆盖的。
4
、被覆盖的方法不能为
private
。否则在其子类中只是
新定义了一个方法,并没有对其进行覆盖。
5
、被覆盖的方法不能为
static
。所以如果父类中的方法
为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误。反之亦然。即使父类和子类中的方法都是静态的,
并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
方法的覆盖和重载具有以下相同点:
都要求方法同名
都可以用于抽象方法和非抽象方法之间
方法的覆盖和重载具有以下不同点:
方法覆盖要求参数列表(参数签名)必须一致,而方法重载要求参数列表必须不一致。
方法覆盖要求返回类型必须一致,方法重载对此没有要求。
方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方
法)
方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。
另外,对于属性(成员变量)而言,是不能重载的,只能覆盖。
分享到:
相关推荐
在C++编程语言中,函数的重载(Overloading)和覆盖(Overriding)是两个重要的概念,它们分别涉及到同一作用域内的多态性和继承体系中的多态性。本篇文档将深入探讨这两个主题,帮助你更好地理解和运用它们。 ### ...
### 函数重载和覆盖的区别 #### 一、引言 在编程领域,函数重载(Overloading)和覆盖(Overriding)是两种常见的多态性实现方式,它们允许程序员在代码中创建更加灵活和复用性强的功能。尽管两者名称相似,但它们...
JAVA中的重载(Overload)和覆盖(Override)是面向对象编程中两个核心概念,尤其在多态性的体现上扮演着重要角色。这两者虽然在名称上相似,但在实际应用和概念理解上有着本质的区别。 ### 重载(Overload) 重载是在同...
"Java中的方法重载和覆盖的区别" Java中的方法重载和覆盖是两个常见的概念,但很多开发者容易混淆这两个概念。在Java中,方法重载(Overloading)和方法覆盖(Overriding)都是实现多态性的手段,但它们之间有着...
在Java编程语言中,函数重载(Overloading)和覆盖(Overriding)是面向对象特性的重要组成部分,它们分别处理多态性中的静态多态和动态多态。本篇将通过一个具体的例子,深入探讨这两个概念。 函数重载是指在同一...
3. **子类不能通过重载覆盖父类的私有(private)方法**:如果子类试图定义与父类中私有方法相同名称和参数列表的方法,那只是创建了一个新的方法,而非重载。 **二、什么是覆盖(Overriding)** 覆盖发生在继承关系中...
Java编程语言的学习涉及众多核心概念,本篇笔记主要探讨了几个关键知识点:继承、重载和覆盖。首先,我们从Java环境配置开始,确保能够正确地运行Java程序。在Windows系统中,需要设置环境变量PATH,指向JDK安装目录...
### Java中的方法重载(Overloading)与方法覆盖(Overriding) #### 方法的重载(Overloading) ...总结来说,在Java中正确理解和应用方法重载和方法覆盖是非常重要的,这有助于编写更加灵活和高效的代码。
通过以上的介绍,我们可以看到,虽然重载、重写(覆盖)和隐藏都涉及到函数的同名问题,但它们的含义和应用场景却完全不同。理解这些概念可以帮助我们在实际开发过程中更加灵活地运用这些特性,避免一些潜在的问题。
### 重载、覆盖和隐藏:面向对象编程中的三大概念 在面向对象编程中,类成员函数的重载(Overloading)、覆盖(Overriding)和隐藏(Hiding)是三个非常重要的概念,它们帮助程序员更好地管理和扩展代码。下面将...
Java语言中的覆盖(Override)和重载(Overload)以及多态(Polymorphism)是面向对象编程...综上所述,Java中的覆盖和重载以及多态机制使得代码更加灵活,可读性和可维护性得到提升,同时也为面向对象设计提供了强大的工具。
总结一下,"重载"(Overload)和"覆盖"(Override)的主要区别在于: 1. 重载发生在同一类中,而覆盖发生在子类对父类的继承关系中。 2. 重载关注方法的签名(包括名称和参数列表),允许返回类型不同;而覆盖要求...
多态在Java中主要体现在方法的重载(Overloading)和覆盖(Overriding)上。 1. 多态(Polymorphism) 多态的概念指的是同一种行为可以有不同的表现形式。在Java中,多态主要通过继承和接口来实现。例如,`Person`...
在提供的代码示例中,我们可以看到派生类如何通过重载、覆盖和隐藏来改变函数的行为。例如,在第一个示例中,派生类`Derive`定义了一个接受`int`参数的`fun`函数,隐藏了基类`Base`中的无参`fun`函数。因此,当你...
### C#中的重载与覆盖例子 在C#编程语言中,重载(Overload)与覆盖...重载主要关注于方法签名的不同,而覆盖则关注于通过继承和虚方法来实现不同的行为。理解这两者的区别对于编写灵活、可扩展的代码至关重要。
### 重载、重写、覆盖与多态的深刻剖析 在面向对象编程语言中,如Java、C#等,重载(Overloading)、重写(Overriding)、覆盖(也称为重写)以及多态(Polymorphism)是几个非常重要的概念。它们之间既有关联又有...
重载(Overload)和覆盖(Override)是面向对象编程中的两个重要概念,它们在PHP和Java等编程语言中有着不同的应用和规则。 **重载(Overload)** 重载通常发生在同一类内部,指的是可以有多个同名方法,但这些方法的...
"java题.txt"和"Java语言》练习题.txt"可能是不同来源的Java题目集合,覆盖范围广泛,可以作为综合性的复习材料。 "Java测试题2.txt"是另一套测试题,可能包含与"1"不同的题目,提供更多练习机会。 通过解答这些...
### C#中的重载(Overloading)、覆盖(Overriding)与隐藏(Hiding) #### 一、概述 在面向对象编程语言C#中,方法的重载(Overloading)、...通过正确应用重载、覆盖和隐藏,可以编写出更加灵活、易于扩展和维护的代码。