1 重载概述
- 当我们在定义一个类的时候 java允许类中存在多个相同名字的方法
- 但这些相同名字的方法的参数的个数、种类和顺序至少有一个互不相同
- 重载的方法返回类型没有约束(可有可无、可相同可不相同)
- 重载的访问修饰符没有限制(可相同可不相同)
1.1 正确定义重载方法的示范
定义了一个鸭子类,这个鸭子有多个swimming()方法
这些方法的参数个数、种类、顺序至少有一个互不相同
package bigbigmeng.test;
/**
@author Liu Xianmeng
@createTime 2022/11/10 17:07
@instruction 定义一个鸭子类(只重演示重载方法 不定义属性)
*/
@SuppressWarnings({"all"})
public class Duck {
// 这只鸭子会游泳
public void swimming(){
System.out.println("The duck is swimming...");
}
public void swimming(String name){
System.out.println("The duck is swimming... It's name is " + name);
}
public void swimming(String name, int age){
System.out.println("The duck is swimming... It's age is " + age);
}
public void swimming(int age, String name){
System.out.println("The duck is swimming... It's age is " + age);
}
}
当参数个数、种类、顺序至少有一个互不相同,而返回值相同,则认为这两个方法是同一个方法 因为返回类型的不同不作为评判两个方法是否符合重载方法定义的标准
1.2 错误定义重载方法的示范
也就是说,如果一个类中有两个方法的参数种类、数量和顺序完全一致,那么这两个方法只能留下一个 ,java认为他们是同一个方法(而不管返回类型如何)
2 重写概述
- 子类重新编写父类的某个方法(方法名和参数列表必须相同!)
【解释】子类重写父类的方法,方法的方法名和参数的个数、类型和顺序必须一致
- 重写的方法返回类型必须与父类的此方法一致 或者是父类此方法返回类型的子类(即 子类的返回类型的抽象程度要小于等于父类
【解释】例如,当父类的方法的返回对象的List集合的时候,子类重写此方法的返回值必须也是List类型或者是ArrayList(List的子类),而不可以是Object
- 重写的方法的访问修饰符的范围要小于等于父类
【解释】例如,父类的方法的访问修饰符是protected,那么子类重写后的访问修饰符的类型只能是protected、default或者private(范围小于等于父类);而不能是public(范围超过父类)
2.1 重写代码举例
父类代码
public class Father {
public void study(){
System.out.println("C Father M study()...");
}
}
子类代码
public class Son extends Father {
public static void main(String[] args) {
new Son().study();
}
}
运行结果:
显然,如果子类不想在执行此方法的时候打印C Father M study()...
而是打印 C Son M study()... 那么就需要重写父类的这个方法
子类重写父类study方法后
public class Son extends Father {
@Override
public void study() {
System.out.println("C Son M study()...");
}
public static void main(String[] args) {
new Son().study();
}
}
运行结果:
这便是重写方法的作用,当父类的方法在子类使用不合适时,可以进行重写以覆盖父类这个方法的功能
3 重写和重载的对比总结
方法位置 | 方法名 | 返回类型 | 访问修饰符 | 参数列表 | |
重载 | 本类中 | 必须相同 | 无要求 | 无要求 | (见上文) |
重写 | 子类中 | 必须相同 | <=父类 | <=父类 | 完全相同 |
可见,重载和重写有着明显的定义区别 >.<