Java中⽅法重写的返回值修饰符问题
在研究重写问题之前先看⼀下什么是⽅法签名?
⽅法签名由⽅法名称和⼀个参数列表(⽅法的参数的顺序和类型)组成。
注意,⽅法签名不包括⽅法的返回类型。不包括返回值和访问修饰符。
⽅法重写
“⽅法的签名” 与⽗类⼀模⼀样,并且在⽗⼦类之间出现⽅法签名⼀致, 这个叫重写/覆盖
编译时。⼦类必须能看见⽗类的⽅法,所以⽗类⽅法可重写的条件不能被 private 修饰。
重写的规范
在⽅法前加上@Override, 编译器会帮你做重写检查
先说下返回值问题
⼦类返回值[层次] <= ⽗类返回值[层次]
在李阳的Java疯狂讲义中说重写返回值类型要⽐⽗类⼩,什么叫⽐⽗类⼩,即使实现或者继承了该类的类,经过查阅相关资料得出下⾯结论Java 5或者以前,必须⼀样,java 7 java 8可以不同,但是必须是⽗类返回值的派⽣类。
再说下访问修饰符
修饰符: ⼦类权限 >= ⽗类权限
Java中访问修饰符的范围⼤⼩ public > protected > default > private,⼦类重写⽗类的⽅法的访问修饰符,不能低于⽗类的⽅法访问权限;
结合例⼦说明⼀下,代码是在JDK1.8的环境下编辑的。
类之间的逻辑关系也很简单
Child 继承⾃ Father 类,⽬的是重写 Father ⾥⾯的⽅法。
Vegetable 继承⾃ Food 类并实现了 Healthy 接⼝。⽬的是测试重写⽅法的返回值和权限修饰符规则。
贴下代码:
public class Father {
protected Food protectedLoad(){
return null;
}
protected Healthy protectedLoadInterface(){
return null;
}
}
在 Father 类中定义了两个⽅法
protectedLoad: 修饰符为 protected ,返回值为 Food 类。
protectedLoadInterface: 修饰符为 protected,返回值为 Healthy 接⼝。
public class Chlid extends Father{
@Override
public Vegetable protectedLoad(){
return null;
}
@Override
protected Vegetable protectedLoadInterface(){
return null;
}
}
java重写和重载的区别在继承⾃ Father 的 Chlid 类中,分别对 protectedLoad 和 protectedLoadInterface ⽅法实现了重写。可以看到protectedLoad: 修饰符拓展为了 public ,返回值为 Food 类的⼦类 Vegetable。
protectedLoadInterface: 修饰符为 protected ,未做修改,返回值为 Healthy 接⼝的实现类 Vegetable。
所以,经过实践可以很清楚的得出我们上⾯的结论
重写⽅法返回值类型要⽐⽗类⼩。
重写⽅法的访问修饰符不能低于⽗类的⽅法访问权限。
另外三个辅助类
public class Food {
}
public interface Healthy {
}
public class Vegetable extends Food implements Healthy{
}
这⾥再说⼀下题外话,关于⽅法重载的问题
⽅法的重载:
判定⼀个⽅法是否属于重载或重复定义是根据⽅法的签名来定。
所以主要你的⽅法名和参数列表相同,编辑器就会判断两个⽅法为同⼀个⽅法。咱们继续使⽤ Father 类的例⼦,如下,定义两个相同⽅法名和参数列表的 getFood ⽅法。
public class Father {
protected Food protectedLoad(){
return null;
}
protected Healthy protectedLoadInterface(){
return null;
}
private Food getFood(int num){
return new Food();
}
//这⾥会在Idea中报错,提⽰ getFood(int) is already defined in Father
private int getFood(int num){
return num;
}
}
在上⾯的例⼦中,编译器直接爆出 getFood(int) is already defined in Father 的错误,所以关于⽅法重载的问题,只与⽅法的签名相关和⽅法的返回值⽆关,签名相同会被编辑器认为是同⼀个⽅法。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。