1.子类方法的访问修饰符要大于或者等于父类要重写方法的范围
class A{
public void m(){}
}
class B extends A{
void m(){}
}
这个时候子类的访问范围比父类小,我们姑且算它是对的进行反推
A a =new B();//向上转型
a.m();//a对象是由A类申明,就可以去调用A中的方法,m()在任意位置都可以访问。
a.m();//调用方法的时候具体的执行看子类,就可以去调用B类中的m(),可以在本类或者同胞类访问,
此时出现了矛盾就说明子类的访问权限修饰符要么等于或者大于父类。
2.如果父类的返回值数据类型是引用数据类型,子类的引用数据类型要么和父类相等要么是父类的子类
Class A{
public void n(){}
}
Class B extends A{
public void m(){}
}
Class c{
public B m(){return null;}
}
Class D extends c{
public A m(){return null;}
}
C c=new D();//向上转型
B b=c.m(); //因为c对象是c类声明的,就可以去访问c类中的方法;调用完方法返回值是B类类型,就可以去访问B类中的方法
A a=c.m(); //方法的具体执行看子类,去调用的是D类中的方法,调用完之后返回A类,就可以访问A类中的方法---但是这个时候多态的意思是声明靠父类所以可以调用父类中的方法,但是具体实现由子类完成,此时产生的问题是声明返回的是B类调用的方法中父类A中可能无法实现 所以A类中的方法接不住B类中的 ,所以还是要重写方法的返回类型子类方法的返回类型是父类被重写方法的子类或者同类。