重载与重写

来源:互联网 发布:淘宝网追风英雄旗舰店 编辑:程序博客网 时间:2024/05/17 12:56

先看下 定义!!!

方法重载(overloading method)
       方法重载是让类以统一的方式处理不同类型数据的一种手段。Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法, 这就是多态性。下面是一个方法重载的例子:
class  MethodOverloading {
     viod receive(int i) {
System.out.println("Received one int data");
System.out.println("i="+i);
     }
      viod receive(float f) {
System.out.println("Received one float data");
System.out.println("f="+f);
     }
     viod receive(String s) {
System.out.println("Received a String");
System.out.println("s="+s);
     }
    }

注意,Java的方法重载要求同名的方法必须有不同的参数表,仅有返回类型不同是不足以区分两个重载的方法。

方法重写(overiding method)
       在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类

 

 

Overloaded的方法是可以改变返回值的类型。--重载


这句话是正确的,唯一区分方法重载的是方法的参数列表不同,当参数列表不同时就可改变其返回类型

 

看下解释-----

 

 在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。这样有什么好处呢?以Object类的clone方法为例:
class Object {
 ...
 public Object clone() { ... }
}
在5.0以前,如果子类需要重载clone方法,必须像下面这样写代码:
class Point {
 public int x;
 public int y;
 public Point(int x, int y) { this.x=x; this.y=y; }
 public Object clone() { return new Point(x,y); }
}
虽然在我们的Point类里,clone方法总是返回一个Point类型的对象,但却必须把返回类型写成Object,在外部使用clone方法时也必须使用恼人的强制类型转换。
在Java5.0以后,我们就可以利用新的覆盖规则,像下面这样编写代码:
class Point {
 public int x;
 public int y;
 public Point(int x, int y) { this.x=x; this.y=y; }
 public Point clone() { return new Point(x,y); }
}
这样,我们就可以直接使用Point p2 = p1.clone(); 而不用强制类型转换了。
 
2.泛型重载
       Java的方法重载一般指在同一个类中的两个同名方法,规则很简单:两个方法必须具有不同的方法签名。换句话说,就是这两个方法的参数必须不相同,使得编译器能够区分开这两个重载的方法。由于编译器不能仅仅通过方法的返回值类型来区分重载方法,所以如果两个方法只有返回类型不同,其它完全一样,编译是不能通过的。
在泛型方法的重载时,这个规则稍微有一点变化。先看下面代码:
class Overloaded {
 public static int sum(List<Integer> ints) {
    int sum = 0;
    for (int i : ints) sum += i;
    return sum;
 }
 public static String sum(List<String> strings) {
    StringBuffer sum = new StringBuffer();
    for (String s : strings) sum.append(s);
    return sum.toString();
 }
}
上面是两个泛型方法的重载例子,由于Java的泛型采用擦除法实现,List<Integer>和List<String>在运行时是完全一样的,都是List类型。也就是,擦除后的方法签名如下:
int sum(List)
String sum(List)
Java允许这两个方法进行重载,虽然它们的方法签名相同,只有返回值类型不同。这在两个普通方法的重载中是不允许的。当然了,如果两个泛型方法的参数在擦除后相同,而且返回值类型也完全一样,那编译肯定是不能通过的。
类似地,一个类不能同时继承两个具有相同擦除类型的父类,也不能同时实现两个具有相同擦除的接口。如Class A implements Comparable<Integer>, Comparable<Long>。
总结一下,两个泛型方法在擦除泛型信息后,如果具有相同的参数类型,而返回值不一样,是可以进行重载的。Java有足够的信息来区分这两个重载的方法。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jk88811/archive/2007/09/21/1794866.aspx