| 在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。 Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。
 注意:"协变返回(covariant return)",仅在subclass(子类)的返回类型是superclass(父类)返回类型的extension(继承)时才被容许。[code=java]public class Demo {
 public static void main(String[] args) {
 A a = new B();
 
 C c = a.display() ;
 c.display() ;
 
 }
 }
 
 class A {
 public C display() {
 System.out.println("this is from A!");
 return new C();
 }
 }
 
 class B extends A {
 public D display() {
 System.out.println("this is from B!");
 return new D() ;
 }
 }
 
 class C {
 public void display() {
 System.out.println("this is from C!!!");
 }
 }
 
 class D extends C {
 public void display() {
 System.out.println("this is from D!!!");
 }
 }[/code]这个是可以编译通过的。
 
 D继承C重写了display()方法,返回的都是void类型。
 B继承A,都写了display()方法,但是类型看似乎不一样,一个返回的是类C,一个是继承了类C的类D,这里就是协变返回了。
 
 结果为:[code=java]this is from B!
 this is from D!!![/code]
 |