`
wenzy_way
  • 浏览: 23901 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

方法重载(Overload)和方法覆盖/重写(Override)的区别

阅读更多

    方法重载和方法覆盖(或称重写,下问称覆盖)是我们进行Java语言编写中经常碰到的情况,但在编程中,因为开发软件自带提示和编译功能,我们往往不容易出错,但一回到纸质问答上,经常是容易混淆,吃了多次亏。所以准备在这里总结一下,以免下次再碰到这尴尬的情况。
首先重载与覆盖的区别
1、方法重载是同一个类中多个方法之间的关系,是水平关系;而方法覆盖是子类和父类之间的关系,是垂直关系。
2、方法重载要求参数的列表不同(类型或者数目,仅形参名不同不视为参数列表不同),覆盖则要求参数列表相同(形参名不同亦视为参数列表相同)。
3、方法重载是多个方法之间的关系;覆盖只能由一个方法,或只能由一对方法产生关系。
4、重载关系,是根据调用时的实参表与形参表来选择方法体的,覆盖关系,调用哪个方法则是根据对象的类型(对象存储空间,判断是父类还是子类)来决定。


override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值类型必须和被覆盖的方法的返回一致;
3、覆盖的方法不允许声明抛出比被覆盖的方法范围更大的异常类型,换句话说就是所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、覆盖的方法不允许使用比被覆盖的方法更严格的访问权限,如被覆盖为protected,则覆盖的应该是protected,public;
5、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖,即失去了覆盖的意义。

overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序;
2、不能通过访问权限、返回类型、抛出的异常的不同来定义重载,当参数列表不同时,返回值类型和修饰符可以不同;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果

测试代码:
class A {
protected void fun(int a, int b) throws IOException {}
protected void fun1(int a, int b) throws IOException {}
}

public class B extends A{
//Override
//public void fun(int a, int b) {} //正确,重写父类方法,可以扩大访问权限
//protected void fun(int a, int c) {} //错误,仅改变形参名不视为重写
//protected void fun(int a,int b) throws Exception{} //错误。重写父类方法,不能抛出范围更大的异常
//protected String fun(int a, int b) {} //错误,重写父类方法,不能改变返回值类型
//private void fun(int a, int b) {} //错误,重写父类方法,不能降低访问权限

//Overload
//protected void fun1(int a, long c) {} //正确,重载父类方法,需改变参数类型
protected void fun1(int a, int b,long c) {} //正确,重载父类方法,可以改变参数列表
public String fun1(int a, long b) {return null;} //正确,修改参数列表后,可以改变访问类型和返回值

}

 

1
3
分享到:
评论

相关推荐

    重写(override)和重载(overload)的区别

    C#中方法的重写(override)和重载(overload)的区别

    Java重写(Override)&重载(Overload).pdf

    在 Cat 类中,使用相同的名称和参数列表来重新定义了 move() 方法,并且使用 @Override 注解向编译器说明这是一个重写方法。 class Animal { public void move() { System.out.println("动物可以移动"); } } ...

    Java重载和重写的区别--源码实例

    // 下面几个方法用来验证可以通过定义不同的参数类型和参数的数目进行方法重载。 public void fun(){ System.out.println("method fun in OverloadTest, no parameter"); } public void fun(float f) { System...

    java 重载(overload)与重写(override)详解及实例

    主要介绍了java 重载(overload)与重写(override)详解及实例的相关资料,并附实例代码,需要的朋友可以参考下

    Java重写(Override)与重载(Overload)区别原理解析

    主要介绍了Java重写(Override)与重载(Overload)区别原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java 重写(Override)与重载(Overload).pdf

    java

    Java overload和override的区别分析

    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现,想要了解更多请参考本

    java面试题

    重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象...

    SCJP考试题集 有详细解析

    此题涉及方法重载(overload),方法重写(override)以及类派生时方法重写的规则。方法重载的规则是:一、参数列表必须不同,个数的不同 完全可以,如果个数相同则参数类型的不同不能引起歧意,例如int 和long,...

    PHP中overload与override的区别

    override(重写,覆盖) 1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 4、存在于父类和子类之间。 5、方法被...

    C++中overload,override,overwrite的区别详细解析

    Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型、顺序不同),即函数重载。(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;...

    Java复习大纲面试题.doc

    方法重载与方法重写的区别? 方法重载(Overload):是指方法名字相同,参数的个数、类型、次序不同。 方法重写(Override/Overwrite):是指子类重写了从父类继承过来的方法。 区别:方法重载没有继承、属于一种静态联编...

    21天学会Java之(Java SE第三篇):包、方法、对象和类、类的定义、属性(成员变量)、构造器(构造方法)

    文章目录包包(package)的作用JDK中主要的包包的命名规范导入类(import)方法方法的使用方法的重载(Overload)以及方法的重写(Override)对象(Object)和类(class)面向过程和面向对象对象的本质对象和类的概念类的定义...

    PHP重载基础知识回顾

    先区分一下重载(overload)和重写(override):重载指多个名字相同,但参数不同的函数在同一作用域并存的现象;重写出现在继承中,指子类重定义父类功能的现象,也被称为覆盖。重载中说的参数不同有三种情况:参数个...

    javakejian

    1)覆盖( override )——在子类中对从父类继承的方法进行重新定义,即重写。 2)重载( overload )——在同一个类中定义多个同名的定义内容不同但最终功能相同的方法。 比如,程序中定义多个名为 print方法,...

    C++中的重载、覆盖、隐藏介绍

    前几天面试时被问及C++中的覆盖、隐藏,概念基本答不上来,只答了怎么用指针实现...二、重写(也称为覆盖 override) 是指派生类重新定义基类的虚函数,特征是: (1)不在同一个作用域(分别位于派生类与基类) ; (2

    java笔试题

    20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? 21、描述一下JVM加载class文件的原理机制? 22、char 型变量中能不能存贮一个中文汉字,为什么? 23、抽象类(abstract class...

    浅谈C++重载、重写、重定义

    二、重写(也称为覆盖 override) 是指派生类重新定义基类的虚函数,特征是: (1)不在同一个作用域(分别位于派生类与基类) ; (2)函数名字相同; (3)参数相同; (4)基类函数必须有 virtual 关键字,不能有...

    C++背题大纲1

    1.虚函数 2.纯虚函数 3.内存泄漏 内存溢出 野指针 4.访问控制 5.类中对象分布 6.overload重载 override覆盖 overwrite重写

Global site tag (gtag.js) - Google Analytics