再探Java⼦类⽅法重写⽗类⽅法遵循“两同两⼩⼀⼤”规则
今天在⽜客碰到这样⼀道题:
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;}
正确答案:C
复习⼀下⼦类⽅法重写⽗类⽅法遵循“两同两⼩⼀⼤”的规则
⼦类覆盖⽗类要遵循“两同两⼩⼀⼤”
“两同”即⽅法名相同,形参列表相同
“两⼩”指的是⼦类⽅法返回值类型应⽐⽗类⽅法返回值类型更⼩或相等,⼦类⽅法声明抛出的异常类应⽐⽗类⽅法声明抛出的异常类更⼩或相等。
(注:看到有⽹友有这样的疑问,⽗类⽅法返回值是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;}语法错误
java重写和重载的区别