今天在牛客碰到这样一道题:
class A {
public A foo() {
return this;
}
}
class B extends A {
public A foo() {
return this;
}
}
class C extends B
{
//这样填写什么代码不会报错
}
选项分别是:
A.public void foo(){}
B.public int foo(){return 1;}
C.public A foo(B b){return b;}
D.public A foo(){return A;}
复习一下子类方法重写父类方法遵循“两同两小一大”的规则
子类覆盖父类要遵循“两同两小一大”
“两同”即方法名相同,形参列表相同
“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等。
(注:看到有网友有这样的疑问,父类方法返回值是double,子类修改成int为什么不行呢?
这是因为返回值类型更大或者更小,是对于同一类型而言的。也就是说,返回值的类型需要有继承关系才去考虑大小这个 概念。类型不同,肯定不是方法重写)
“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。
注意:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法一个是实例方法,否则编译出错。
所以,根据这个原理,再来分析上面这道题。
A.public void foo(){}返回值类型与父类不一致,所以不可能是方法的重写。又因为方法名相同,那么只能是方法重载,而方法重载有需要满足三个条件:形参个数、顺序、类型必须有一者不同,A选项都不满足,错
B.public int foo(){return 1;}与A选项一样
C.public A foo(B b){return b;}返回值类型与父类相同,但由于参数列表不同,所以是对父类方法的重载
D.public A foo(){return A;}
语法错误