快速业务通道

Java语言入门教程(十四):Java语言中方法重载与方法覆盖 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

Java语言入门教程(十四):Java语言中方法重载与方法覆盖

时间:2011-06-13 csdn博客 taomoon719

很多时候,某个Java类中有多个类似的方法。如Math类中,计算绝对值的方 法就会有多个,因为对不同数据类型的数计算方式不同。比如对float,int, long,double各类型的计算方式各不相同,那么Math类中就应该设计4个求绝对 值的方法,分别对每种类型进行计算。在这种情况下,最好的方式就是设计4个 同名,但是不同参的方法,如下所示(请参见API帮助文档):

abs(double a)
          Returns the absolute value of a double value.
abs(float a)
          Returns the absolute value of a float value.
abs(int a)
          Returns the absolute value of an int value.
abs(long a)
          Returns the absolute value of a long value.

这就是方法重载,英文为overloading。方法重载的定义为:在一个Java类中 ,多个同名,但是不同参的方法,称为方法重载。方法重载主要能提高代码的可 读性,对方法的使用者提供便利。

说到方法重载,还有一个特别容易混淆的概念就是方法覆盖,也称为方法重 写,英文为overridding。方法覆盖是在继承时才有的概念。先从代码入手。

如父类Employee中有如下方法:

public void setSalary(double salary,double rate) {
       this.salary = salary*(1+rate);
}

假设Employee的子类Sales中,也有该业务逻辑,只不过实现方式有些不同。 假设实现方式如下:

this.salary = salary*(1+2*rate);

这种时候,就可以在子类Sales中,定义一个与父类同名同参的方法:

public void setSalary(double salary,double rate) {
       this.salary = salary*(1+2*rate);
}

这就是方法覆盖。即子类中拥有一个与父类同名同参同返回值,但是方法体 的逻辑有些区别的方法,我们就称为子类覆盖了父类某个方法。覆盖父类方法后 ,如下调用:

Sales s=new Sales();

s.setSalary(6000,0.1);

此时调用的是子类的setSalary方法,也就是说,子类Sales的对象,再也调 用不到Employee中的setSalary(double,double)方法,因为这个方法已经被 Sales重写成自己的setSalary(double,double)了。

初学者看到这个定义,往往有一个疑问。既然Sales类的setSalary方法的逻 辑有所不同,那么为什么非要定义成与父类同名的方法,不能重新命名么?如:

public void setSalesSalary(double salary,double rate) {
       this.salary = salary*(1+2*rate);
}

如果这样定义,一样能够完成新的逻辑。那么方法覆盖有意义么?

假设我们在Sales中定义了setSalesSalary方法,那么Sales中还拥有 Employee的setSalary方法:

public void setSalary(double salary,double rate) {
       this.salary = salary*(1+rate);
}

这样以来,就导致Sales类中拥有一个Sales对象不该具有的行为,这是大错 特错的。

方法覆盖的概念总结如下:

1、子类中的方法与父类的方法同名、同参、同返回值

2、子类的方法的访问权限不能缩小,只能等同或者扩大

3、子类的方法不能抛出比父类方法更多的异常类型(异常处理会在以后文章 中讲解)

方法重载,方法覆盖是两个容易混淆的概念,其实是完全没有关联的。重载 指的是一个类中,多个同名不同参的方法,而覆盖是在父类与子类中存在的概念 。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号