方法重载:在同一个类中,允许存在多个同名方法,只要它们的参数列表不同,与修饰符和返回值类型无关,这样的多个同名方法之间构成重载。
参数列表:参数个数,参数类型,参数顺序
方法调用:根据实际传入的参数决定调用哪个方法。
代码示例:
public class OverloadTest {
public static void main(String[] args) {
//根据实际传入的参数决定调用哪个方法
sum();
System.out.println(sum(15));;
System.out.println(sum(10.5d, 15.3d));;
}
public static void sum() {
System.out.println(10 + 10);
}
private static int sum(int a) {
return a + 10;
}
static double sum(double a, double b) {
return a + b;
}
}
方法重写:当父类中的方法对于子类来说不适用时,子类可以对从父类中继承来的方法进行重写/覆写。
方法调用:根据对象所属的类决定调用哪个类的方法。
代码示例:
class Father {
void show() {
System.out.println("Father show");
}
}
class Son extends Father {
@Override
public void show() {
System.out.println("Son show");
}
}
public class OverrideTest {
public static void main(String[] args) {
Father f1 = new Father();
f1.show();
//多态引用,实际创建还是子类对象,调用的也是子类重写的show方法
Father f2 = new Son();
f2.show();
}
}
区别总结:
重载 | 重写 | |
---|---|---|
定义位置 | 同一个类中 | 父类(接口)、子类(实现类) |
方法名 | 必须相同 | 必须相同 |
形参列表 | 必须不同 | 必须相同 |
返回值类型 | 无关 | 如果是基本数据类型和void,必须一致;如果是引用数据类型,重写方法的返回值类型必须和被重写方法的返回值类型相同或是它的子类 |
权限修饰符 | 无关 | 重写方法的访问权限必须 大于或等于 被重写方法的访问权限 |
方法调用 | 根据传递的实际参数 | 根据对象的类型 |
抛出的异常 | 无关 | 重写方法抛出的异常类型要么和被重写方法相同,要么是被重写方法抛出的异常的子类,要么不抛出异常 |