快速业务通道

Java的Overriding与Overloading - 编程入门网

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

Java的Overriding与Overloading

时间:2011-03-13 51cto博客 zhangjunhd

1.Overriding

Overriding翻译过来是“重写/覆盖”。 它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。

重写的主要特点是:

1)方法名必须与被重写方法一致。

2)方法参数列表必须与被重写方法一致。

3)返回类型必须与被重写方法一致。

4)重写的方法不能降低原方法的"可见度"。

例如:被重写方法为protected void do(int i,double d),则重写方法可以为protected void do(int i,double d),或者public void do(int i,double d),但是不可以是private void do(int i,double d)。

5)不能抛出新的异常或者"更宽的"异常。

例如:被重写方法为public void do(int i,double d) throws IOException,则重写方法可以为public void do(int i,double d) throws IOException ,或者public void do(int i,double d) throwsddeeException(IOException的子类),但是不可以是public void do(int i,double d) throwsException,因为Exception是IOException的父类,比IOException"更宽"。

6)被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

2.Overloading

Overloading,翻译成“重载”。 它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。

其特点是:

1)各重载的方法名一致。

2)各重载方法的参数列表不一样(包括参数类型,参数个数,参数顺序3项中的一项或多项)。

3)返回类型任意。(不能通过方法的返回值来区分重载方法。)

4)访问控制符任意。(不能通过方法的访问权限来区分重载方法。)

5)可以任意抛出自身的异常,而不管被重载方法。(不能通过抛出的异常来区分重载方法。)

Overloading是指“Two or more methods can have the same name if they have different numbers or types of parameters and thus different signatures. ”显然,对重载的唯一要求就是参数列表必须改变,否则就不是重载了。

3.类型转换中的重载

在一些情况下,Java 的自动类型转换也适用于重载方法的自变量。例如,看下面的程序:

// Automatic type conversions apply to overloading. class OverloadDemo {   void test() {     System.out.println("No parameters");   }   // Overload test for two integer parameters.   void test(int a, int b) {     System.out.println("a and b: " + a + " " + b);   }   // overload test for a double parameter   void test(double a) {     System.out.println("Inside test(double) a: " + a);   } } class Overload {   public static void main(String args[]) {     OverloadDemo ob = new OverloadDemo();     int i = 88;     ob.test();     ob.test(10, 20);     ob.test(i); // this will invoke test(double)     ob.test(123.2); // this will invoke test(double)   } }

该程序产生如下输出:

No parameters

a and b: 10 20Inside test(double) a: 88Inside test(double) a: 123.2

在本例中,OverloadDemo 的这个版本没有定义test(int) 。因此当在Overload 内带整数参数调用test()时,找不到和它匹配的方法。但是,Java 可以自动地将整数转换为double 型,这种转换就可以解决这个问题。因此,在test(int) 找不到以后,Java 将i扩大到double 型,然后调用test(double) 。当然,如果定义了test(int) ,当然先调用test(int) 而不会调用test(double) 。只有在找不到精确匹配时,Java 的自动转换才会起作用,而且总是找到参数类型最"匹配"的方法,即它的形参比实参“大”且是最“接近”的。

本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/20373

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号