举反例------咱们就让子类重写的返回值类型与不是父类方法的返回值的子类
class A{}
class B extends A{
public void mb(){}
}
class C{
public B m(){...}
}
class D extends C{
public A m(){...}
}
---------------------------------------------------------------------
C c=new D(); //c类对象声明是C类,所以C类告诉c对象有一个m方法可以使用,并且m方法的返回值类型是B
B b=c.m(); // c对象的实际类型是D类型,所以m方法的执行看的是D类,D类告诉c对象返回值类型是A类(相当于 B b=A 即将父类赋值给子类)
b.mb();//b对象实际运行的是A类,A类中没有mb方法