class A{ public A foo() { return this; } } class B extends A { public A foo(){ return this; } } class C extends B { _______ }
可以放入到横线位置,使程序正确编译运行,而且不产生错误的选项是( )
class A{ public A foo() { return this; } } class B extends A { public A foo(){ return this; } } class C extends B { _______ }
public void foo(){}
public int foo(){return 1;}
public A foo(B b){return b;}
public A foo(){return A;}
重写 要求两同两小一大原则, 方法名相同,参数类型相同,子类返回类型小于等于父类方法返回类型, 子类抛出异常小于等于父类方法抛出异常, 子类访问权限大于等于父类方法访问权限。[注意:这里的返回类型必须要在有继承关系的前提下比较]
重载 方法名必须相同,参数类型必须不同,包括但不限于一项,参数数目,参数类型,参数顺序
再来说说这道题 A B 都是方法名和参数相同,是重写,但是返回类型没与父类返回类型有继承关系,错误 D 返回一个类错误 c的参数类型与父类不同,所以不是重写,可以理解为广义上的重载访问权限小于父类,都会显示错误
虽然题目没点明一定要重载或者重写,但是当你的方法名与参数类型与父类相同时,已经是重写了,这时候如果返回类型或者异常类型比父类大,或者访问权限比父类小都会编译错误
public void foo(){} 方法名相同,返回值不同-->不是重写;而参数列表与父类相同,那么也不是重载。
public int foo(){return 1;} 方法名相同,返回值不同-->不是重写;而参数列表与父类相同,那么也不是重载。
public A foo(B b){return b;} 方法名相同,返回值(无所谓),而参数列表与父类不相同,那么是重载。另:B是A的子类,根据里氏替换原则/自动向上转型,可以这个选项正确。
public A foo(){return A;} 方法名相同,返回值相同,而参数列表也与父类相同,那么也不是重载。
方法重载(overload):
1.必须是同一个类
2方法名(也可以叫函数)一样
3参数类型不一样或参数数量不一样
方法的重写(override)两同两小一大原则:
方法名相同,参数类型相同
子类返回类型小于等于父类方法返回类型,
子类抛出异常小于等于父类方法抛出异常,
A public void foo(){
方法名,参数类型和父类相同,但是返回类型和父类没有一定的关系,
既不是重写也不是重载
B public int foo(){return 1;}
和A选项差不多public A foo(){return A;}
D public A foo(){return A;} 方法名相同,参数类型相同,重写,
但是返回类型大于父类类型
C public A foo(B b){return b;}
方法名相同,参数类型不相同,重载