Java方法重写和重载的区别
1.方法重写(Override)
方法的重写主要体现在Java的继承体系中,子类出现了和父类一模一样的方法,方法重写也称为方法覆盖、方法复写。
方法重写的特点:
- 子类与父类的方法名和返回类型相同;
- 子类与父类方法的参数列表相同;
- 子类方法的访问范围不能比父类小;
- 返回值类型必须和被重写方法的类型相等或是其子类;
- 子类不能重写父类的构造方法,
2.方法重载(Overload)
在一个类中,有多个同名的方法,但是每个方法有不同的实现。
方法重载的特点:
- 方法名相同
- 方法的参数个数、参数类型不同
- 仅仅是返回值类型不同不能构成重载
- 构造方法可以重载
例:比如现在有一个eat 方法
//eat方法有两个参数
public void eat(Date time, String food){
}
//这种重载方式是可以的,参数的顺序不一致,也就认为是不同的参数
public void eat(String food, Date time){
}
//这个就不行了,会认为是同一个方法
public void eat(Date time1, String food1){
}
//仅仅是返回值类型不同是不能构成重载的,以下写法就会报错
int f(int a, int b){
return a + b;
}
boolean f(int a, int b){
return false;
}
3.总结两个问题
为什么只有返回值类型不同不能构成重载?
在Java语言中,要重载一个方法,除了要与原方法具有相同的函数名称外,还要求要与原方法有一个不同的特征签名。特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合,而返回值不会包含在所谓的特征签名之中,所以Java不允许只有返回值不同的重载。
为什么构造函数不能被重写?
首先我们要明白,重写的前提是要能被被继承。
构造函数的特点:
- 方法名和类名相等
- 无返回值类型
- 无返回值
根本无法满足函数重写条件。
另外假设可以重写父类构造器,那么子类名字就得和父类相等,显然这是不可能的,所以根本不可能重写父类构造方法。
补充: 方法的重写和重载是实现Java多态的方式,重载一般称为编译时多态,重写通过继承实现,一般称为运行时多态。