方法重载是让类以一种统一的方式处理不同类型的一种手段,调用方法时通过传递不同个数和类型的参数来决定具体使用哪个方法
重载发生在同一个类中,方法名相同,参数列表不同 (包括:参数个数、类型、顺序)
下面给出一些重载的例子:✅
public class Test {
// 原方法
public void f(int a, double b) {}
// 参数个数不同
public void f(int a) {}
// 参数类型不同
public void f(int a, int b) {}
// 参数顺序不同
public void f(double b, int a) {}
}
注意:方法重载与返回值无关!若只是返回值不同,其他都相同 (方法名相同,参数列表相同),不属于重载,反而会编译不通过
因为对于一个有返回值的方法,我们可以选择不要它的返回值,这样就会产生歧义,如下面所示:❌
public class Test {
// 原方法
public void f(int a, double b) {}
// 仅仅只有返回值不同,编译不通过
public int f(int a, double b) {return 0;}
// 测试
public static void main(String[] args) {
Test test = new Test();
// 即可以认为调用的是 public void f(int a, double b)
// 也可以认为调用的是 public int f(int a, double b),只是不保留返回值而已!
test.f(1, 1.0);
}
}
方法重写发生在继承关系的基础之上,子类即可以隐藏和访问父类的方法,也可以重写父类的方法,方便了子类对父类方法的扩展
重写发生在继承关系的基础之上,重写后的方法与原方法有完全相同的返回值类型,方法名,参数列表,唯一不同的只有方法的实现
重载 (Overload) | 重写 (Override) | |
---|---|---|
发生位置 | 同一个类中 | 继承关系中 |
方法名称 | 相同 | 相同 |
参数列表 | 必须修改 | 相同 |
返回类型 | 可以修改 | 相同 |
异常 | 可以修改 | 不能超过父类的范畴 |
访问修饰符 | 无要求 | 不能比父类的低 |