Java:Overriding与Overloading 推荐
2007-03-13 19:42
441 查看
在Java[/i]中,什么是Overriding?[/i]什么是Overloading[/i]?[/i]
author: ZJ 07-3-13
Blog: http://zhangjunhd.blog.51cto.com/
1.Overriding[/b]
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) throws ddeeException(IOException的子类),但是不可以是public void do(int i,double d) throws Exception,因为Exception是IOException的父类,比IOException"更宽"。
6)被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
2.Overloading[/b]
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.[/b]类型转换中的重载[/b]
在一些情况下,Java 的自动类型转换也适用于重载方法的自变量。例如,看下面的程序:
该程序产生如下输出:
No parameters
a and b: 10 20
Inside test(double) a: 88
Inside 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 的自动转换才会起作用,而且总是找到参数类型最"匹配"的方法,即它的形参比实参“大”且是最“接近”的。
4.[/b]参考资料[/b]
[1]Thinking in Java 3rd
[2] Overriding和Overloading
http://blog.csdn.net/andyjava2006/archive/2006/09/13/1218858.aspx
[3] 彻底学习Java语言中的覆盖和重载
http://www.blog.edu.cn/user2/41584/archives/2006/1325849.shtml
[4] JAVA 方法重载
http://blog.sina.com.cn/u/538402f901000685
author: ZJ 07-3-13
Blog: http://zhangjunhd.blog.51cto.com/
1.Overriding[/b]
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) throws ddeeException(IOException的子类),但是不可以是public void do(int i,double d) throws Exception,因为Exception是IOException的父类,比IOException"更宽"。
6)被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
2.Overloading[/b]
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.[/b]类型转换中的重载[/b]
在一些情况下,Java 的自动类型转换也适用于重载方法的自变量。例如,看下面的程序:
[align=left]// Automatic type conversions apply to overloading.[/align] [align=left]class OverloadDemo {[/align] [align=left] void test() {[/align] [align=left] System.out.println("No parameters");[/align] [align=left] }[/align] [align=left] [/align] [align=left] // Overload test for two integer parameters.[/align] [align=left] void test(int a, int b) {[/align] [align=left] System.out.println("a and b: " + a + " " + b);[/align] [align=left] }[/align] [align=left] [/align] [align=left] // overload test for a double parameter[/align] [align=left] void test(double a) {[/align] [align=left] System.out.println("Inside test(double) a: " + a);[/align] [align=left] }[/align] [align=left]}[/align] [align=left] [/align] [align=left]class Overload {[/align] [align=left] public static void main(String args[]) {[/align] [align=left] OverloadDemo ob = new OverloadDemo();[/align] [align=left] int i = 88;[/align] [align=left] ob.test();[/align] [align=left] ob.test(10, 20);[/align] [align=left] ob.test(i); // this will invoke test(double)[/align] [align=left] ob.test(123.2); // this will invoke test(double)[/align] [align=left] }[/align] } |
No parameters
a and b: 10 20
Inside test(double) a: 88
Inside 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 的自动转换才会起作用,而且总是找到参数类型最"匹配"的方法,即它的形参比实参“大”且是最“接近”的。
4.[/b]参考资料[/b]
[1]Thinking in Java 3rd
[2] Overriding和Overloading
http://blog.csdn.net/andyjava2006/archive/2006/09/13/1218858.aspx
[3] 彻底学习Java语言中的覆盖和重载
http://www.blog.edu.cn/user2/41584/archives/2006/1325849.shtml
[4] JAVA 方法重载
http://blog.sina.com.cn/u/538402f901000685
相关文章推荐
- 在Java中,什么是Overriding?什么是Overloading?
- java中方法的重写(overriding)与重载(overloading)的区别
- java语言中方法重载overloading和方法重写(覆写)overriding的区别
- 一个典型的关于java(Overriding && Overloading)问题
- 常见Java面试题 – 第三部分:重载(overloading)与重写(overriding)
- JAVA基础(一)——重载(Overloading)与重写(Overriding)的区别
- 【异常形象】overriding vs. Overloading in Java
- java中重载Overriding与重写Overloading的区别
- Overriding vs. Overloading in Java
- 常见Java面试题 – 第三部分:重载(overloading)与重写(overriding)
- 再谈Java中的覆盖(Overriding)与重载(Overloading)
- java中的方法覆盖(Overriding)和方法重载(Overloading)
- java中重载(Overloading)、重写(Overriding)、重定义(redefinition)
- Java中的方法重写(Overriding)与方法重载(Overloading)
- Java - Method Overloading vs Method Overriding
- 常见Java面试题 – 第三部分:重载(overloading)与重写(overriding)
- Java重载overloading与重写(覆盖)overriding
- 常见Java面试题:重载(overloading)与重写(overriding)
- java的Overriding和Overloading
- Java中的方法重写(Overriding)与方法重载(Overloading)