**
java重写子类方法的返回类型必须是父类方法返回类型的同类或者派生类
class A {
public A m() {
System.out.println("父类A的m");
return new A();
}
}
class B extends A {
@Override
public B m() {
System.out.println("子类B的m");
return new B();
}
}
public class Demo1 {
public static void main(String[] args) {
A a = new B();
// A m1 = a.m(); 编译期只认返回类型是A类型。
B m2 = (B) a.m(); //如果要B类型接收,必须强转。
/**
* 多态时,引用a编译期查找的是父类A的m方法。所以编译期默认返回的是父类的的m方法返回类型。
* 实际调用的却是子类B的m方法。返回的是子类B的类型。
* 所以在22代码行中,返回的类型必须要强转。如果父子类之间没有这种继承派生类关系的话。是无法进行强转的。无法实现多态
* 如果父子类的重写方法返回类型一致,就无需强转。
* 故: 子类的重写方法返回类型必须是父类方法返回类型的同类,或者派生类。主要是为了多态考虑。(编译期确定的返回类型,运行期返回的类型之间的关系问题)
*/
}
}