浅析Java语言中的重载与重写

时间:2022-10-16 10:29:14

浅析Java语言中的重载与重写

摘要:一个类中多个重载的方法,体现了程序编译时的多态,具有很大的灵活性;而利用类的继承过程中出现的重写方法,可以实现程序运行时的多态,大大提高了程序的适应性。重载和重写形式上的相似,加大了学习者理解的难度。本文通过实例讲述了二者的用法,以求为开发者提供借鉴。

关键词:重载;重写;多态;继承

中图分类号:TP311.11 文献标识码:A文章编号:1007-9599 (2011) 05-0000-01

Overloading and Rewriting of Java Language

Peng Jian

(Jiangxi Vocational College of Finance&Economics,Jiujiang332000,China)

Abstract:A class of multiple overloaded methods,reflecting the multi-state program compiled with great flexibility;The use of class inheritance override methods emerged in the process can be achieved when running multiple states,greatly improve the adaptability of the program.Overloading and override similar form,increasing the difficulty of understanding the learner.This paper describes two instances of the use,in order to provide a reference for developers.

Keywords:Overloading;Rewriting;Polymorphism;Inheritance

在Java语言学习的过程中,重载与重写是两个知识难点,也是容易混淆的两个概念。两者之间有相似的地方,但更多的是本质上的不同。开发者必须认真加以区分。

一、理解重载

所谓重载就是指在同一个类中定义了多个同名而不同内容的成员方法。同一个类中多个重载的方法主要通过形式参数列表中参数数据类型不同、参数顺序不同或参数个数不同来区分的。返回值类型和代码体不能区分重载。Java编译器会检查每个方法所用的参数个数,顺序和类型,然后自动调用正确的方法。

例如:

public class Overloading{

int add(int x,int y){return x+y;}//方法一

double add(int x,double y){return x+y;}//方法二

double add(double x,int y){return x+y;}//方法三

int add(int x,int y,int z){return x+y+z;}//方法四

}

在本例中:方法一与二体现的是参数数据类型不同的重载;方法二与三体现的是参数顺序不同的重载;方法一与四体现的是参数个数不同重载;对于重载很容易产生错误的理解,例如类中加入代码:

double add(int x,int y){return double(x+y);}//方法五

int add(int y,int x){return x+y;}//方法六

此时编译会报出错误信息,原因分析如下:

方法五与一貌似是重载,实则二者不可同时存在。假设在程序中需要调用方法add(1,2),那么编译器到底应该返回的是int型还是double型呢?因此这样的重载是非法的。

方法六与一实际上是重复定义方法。究其原因在于没有正确理解形式参数的含义。在这两个方法中,参数都是int型的整数,x,y仅仅是形式参数。程序在调用时将会用相同类型的实际参数带入,而不管形式参数用什么名字,因此这是完全相同的两个方法。

二、理解重写

所谓重写就是指在子类继承父类的过程中重新定义与父类同名、相同参数列表,相同返回值的成员方法。重写是发生在类的继承时才可能出现的。值得注意的是,子类覆盖父类的方法时,访问权限可以扩大,但不能缩小,而且不能产生更多的例外。例如:

public class Fruit{

protected void eat(int x){System.out.println(“吃了”+x+“个水果”);}//父类方法

}

public class Apple extends Fruit{

protected void eat(int x){System.out. println(“吃了”+x+“个苹果”);}//Apple重写方法

}

public class Pear extends Fruit{

protected void eat(int x){System.out.println(“吃了”+x+“个梨”);}//Pear重写方法

}

本例中子类方法的返回值类型,方法名,参数的类型、个数、顺序都与父类方法完全相同,仅在代码体中有差别,这就是重写。

由于子类继承了父类所有的属性和方法(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。例如:

public class Test{

public static void showEat(Fruit f,int x){f.eat(x);}

public static void main(String[] args){

showEat(new Apple(),2);

showEat(new Pear(),1);

}

}

运行的结果是:

吃了2个苹果

吃了1个梨

本例也是面向对象思想中“多态”概念的具体体现。所谓多态就是一个事物的多种表现形式。当把不同的水果作为参数进行调用时,系统在运行时能够自动的选择执行相应的方法而不会出错,这正是多态带给程序很大的灵活性和适应性,也称为运行时的多态。

在实现了重写的子类中同样可以重载方法,但要注意重载的定义,避免错误。例如可以在Pear类中重载eat方法:

protected void eat(int x,String name){System.out.println(name+“吃了”+x+“个梨”);}

倘若将方法写为如下形式:

protected String eat(int x) {return ("吃了"+x+"个梨");}//子类方法

则编译器报错,因为根据继承关系,Pear类从父类Fruit中继承了方法:

protected void eat(int x){System.out.println(“吃了”+x+“个水果”);}//父类方法

此时子类方法和父类方法名称,参数形式完全相同,仅是返回值类型与代码体不同,这不符合重载的定义。

三、结束语

重载和重写的相似之处在于:二者方法的名字都是相同的;另外它们都涉及到多态的概念。它们的差别则在于:重载是针对一个类而言,其中有多个同名方法,而重写是针对父类和子类之间有同名方法;重载是编译时的多态,方法的使用是在编译阶段确定的,而重写是运行时的多态,它是由程序执行时来确定调用哪个方法。从本质上说二者是不同的,仅仅是“形似而神不似”。开发者只有正确把握它们的概念,才能写出高质量的程序代码。

参考文献

[1]张白一,崔尚森.面向对象程序设计――Java.西安电子科技大学出版社,2006

[2]王克宏.Java技术及其应用.高等教育出版社,1999

[作者简介]

彭健(1979-),男,汉族,籍贯江西九江,江西财经职业学院助教,硕士,研究方向:软件开发。

上一篇:钢结构柱脚螺栓预埋安装施工工艺 下一篇:基于VxWorks的多任务程序设计及通信管理