Java:Overriding与Overloading

Java 中,什么是Overriding? 什么是Overloading
author: ZJ 07-3-13
Blog: [url]http://zhangjunhd.blog.51cto.com/[/url]
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) throws ddeeException(IOException 的子类),但是不可以是 public void do(int i,double d) throws Exception, 因为 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 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. 参考资料
[1]Thinking in Java 3rd
[2] Overriding Overloading
[url]http://blog.csdn.net/andyjava2006/archive/[/url] 2006/09/13 /1218858.aspx
[3] 彻底学习 Java 语言中的覆盖和重载
[url]http://www.blog.edu.cn/user2/41584/archives/2006/1325849.shtml[/url]
[4] JAVA 方法重载
[url]http://blog.sina.com.cn/u/[/url] 538402f 901000685

你可能感兴趣的:(java,overloading,overriding)