java1.5 放宽了对类继承过程中方法覆盖的限制,在此之前,除必须一致的方法名及参数列表外,返回类型也必须相同
而 java1.5 以后,子类中覆盖的方法的返回类型可以是父类中被覆盖方法返回类型的子类
这个小小的变化让 java 的面向对象编程更加灵活
package com.techlog.test.service;
/**
* just for test
* Created by techlog on 2016/5/21.
*/
public class ForTest {
public static void main(String[] argv) {
A a = new B();
C c = a.func();
System.out.println(c.getI());
}
}
class A {
public C func() {
C c = new C(5);
System.out.println("A func");
return c;
}
}
class B extends A {
@Override
public D func() {
D d = new D(6);
System.out.println("B func");
return d;
}
}
class C {
protected int i;
public int getI() {
System.out.println("C getI");
return i;
}
public C(int i) {
this.i = i;
}
}
class D extends C {
@Override
public int getI() {
System.out.println("D getI");
return i;
}
public D(int i) {
super(i);
}
}
打印出了:
B func
D getI
6
我们看到,首先打印出的 "B func" 说明继承自 A 类的 B 类成功覆盖了 A 类中的 func 方法,尽管 B 类 func 方法返回类型是父类被覆盖方法返回类型的子类
然后,打印出了 "D getI",这是在 main 方法中调用 c.getI() 方法打印的,这说明,B 类中覆盖的 func 方法确实返回了 D 类型对象