任宪臻
摘 要:在面向对象的java编程语言中,方法的重载和方法重写是两个非常容易混淆的概念。本文主要针对在进行java编程时,对方法重载和方法重写中容易混淆的概念和用法进行阐述,并提供判断是方法重载还是方法重写的原则和条件。
关键词:重写;重载;面向对象
中图分类号:TP312 文献标识码:A 文章编号:1671-2064(2019)04-0049-02
在Java编程中,方法的重载可以描述为多个操作具有相同的名字,但是这些操作接收的消息类型必须不一样,通过方法重载,可以利用同一个操作名称,传递不同的消息,对象根据相应的消息执行不同的操作,方法的重写一般发生在同一个类的内部。而方法的重写则是指不同类型的对象调用同一个操作时可能产生不同的行为,方法的重写主要发生在Java继承关系中,主要是指子类根据需要重写父类的某个方法,这样子类可以产生自己独特的功能行为。
1 重载(overload)
所谓方法的重载,是指在java类中可以定义多个具有相同名字的方法,但是这些相同名字的方法的参数必须不一样。具有不同参数的同名方法就是方法的重载,方法参数的不同可以是不同的参数个数,也可以是参数个数相同,但是参数列表中某个参数的类型不同或参数顺序不一致。
在图1所示的方法重载的例子中,两个方法的名称都是prt,但是两个prt方法的参数类型不同,第一个prt方法中的两个参数都是int类型,而第二个prt方法中的两个参数都是String类型,所以在使用对象ol调用方法prt时,根据方法传递的实参的类型不一样,输出的结果也不一样。
需要注意的是,在方法的重载中,方法的返回类型不作为判断方法重载的条件。如下图2所示,两个方法的名字相同(都是compute),方法中参数的类型不同(int 和double),虽然方法的返回值类型不同(一个返回int,一个无返回值),但是这种情况也是方法的重载。
在java中使用方法的重载时,在保证方法的参数不同的基础上,也一定要避免重载方法调用时可能出现的歧义。如图3所示的代码,当执行语句ol.prt(3, 20)时,Java编译器不知道应该去调用重载方法中的哪一个,所以会导致重载方法的歧义调用,就会导致无法通过编译。
2 重写(override)
方法的重写也称覆盖,是指在java类的继承关系中,子类重写从父类中继承过来的方法,使得这个方法更符合子类的特性。当子类重写父类的方法时,要求该方法的名字、参数类型、参数个数必须和父类的完全相同,而且要求该方法的返回值类型必须和父类的返回值类型一致或者是父类返回值类型的子类型。
子类通过重写从父类继承过来的方法,可以把父类的状态和行为改变为子类自身的状态和行为。子类重写父类的方法后,那么从父类继承过来的这个方法就会被隐藏起来,当子类对象调用这个方法时,调用的一定是子类重写后的方法。图4所示,当执行语句demo.prt()时,调用的是子类重写的从父类继承过来prt方法,所以程序输出的结果是“Son class”,而不是说“Father class”
在子类重写的方法中,可以访问从父类继承过来的成员变量,也可以调用从父类继承的方法,也可以操作子类中定义的新成员变量和新方法,但是如果想要访问因为子类重写而被隐藏的成员变量或者方法,必须通过super来进行调用。如下图5改写的图4中所示的Son类后,输出结果如下所示。当执行语句demo.prt()时,调用的是子类重写的prt方法,但是在这个重写的prt方法中,通过语句super.prt(),则可以调用被子类重写的prt方法隐藏的父类的prt方法。(但是需要注意一点,如果父类中方法的修饰符是private,那么这个方法在子类中通过super也是不能访问的。)
在重写父类的方法时,还必须注意子类重写的方法的访问权限不能低于父类方法的访问权限(访问控制修饰符的访问权限由低到高的顺序是:private、默认友好的、protected、public)。在图6中,父类prt方法的访问控制修饰符是protected,如果子类在重写此方法时使用默认友好的访问权限(无修饰控制符),则代码无法通过编译,这是因为默认友好的访问权限级别低于protected,所以代码编译失败。
子类重写父类方法是Java面向对象编程实现多态的一个重要环节,因为父类的方法可以被它的多个子类重新改写,所以这些子类都可以具有自己的行为特性,那么根据这个特性,我们可以用一个父类的对象变量引用指向子类创建的对象,当这个对象在调用方法时就会具有多种形态,因为不同的子类在重写父类方法时都会生成不同的行为。
综上所述,方法的重载发生在同一个类的内部,通过多个相同的方法名称、但是参数不同(可以是参数个数、参数类型、参数顺序不同)的多个方法,实现同一类型的功能。方法的重载和方法的返回值类型无关,和方法的访问控制修饰符也无关。而方法的重写则发生在不同的类之间,是子类重写父类的方法。通过方法重写,可以使子类具备不同的行为特性。方法重写的前提是继承关系的存在,是子类重写从父类继承过来的方法。在实际的Java编程应用中,我们应该根据具体的情况,选择应用方法的重载或者重写来实现程序的功能。
参考文献
[1] [美]凯 S.霍斯特曼(Cay S.Horstmann).Java核心技术 卷I:基础知识(原书第10版)[M].机械工业出版社,2016.
[2] [美]Bruce Eckel.陈昊鹏,译.Java编程思想(第4版)[M].机械工业出版社,2007.
[3] 耿祥義,张跃平.Java2实用教程(第5版)[M].清华大学出版社,2018.