重载发生在同一类中且参数列表不同,重写发生在子类中且参数列表完全相同;重载对返回类型无要求,重写需返回相同或协变类型;private、static、final方法不可重写,构造方法可重载但不可重写。

最直接的辨别方式看两点:方法在哪儿定义、参数列表变没变。重载一定发生在同一个类里,参数列表必须不同;重写一定发生在子类里,参数列表必须完全一样。
发生位置不同
重载只在一个类内部出现,比如你在一个工具类里写了多个 add() 方法,分别接受 int、double、int, int, int,这就是重载。它和继承无关。
重写只出现在子类继承父类时,子类重新提供父类中已有的方法实现,比如 Dog 类重写父类 Animal 的 makeSound() 方法。
参数列表是核心判断依据
重载要求参数列表必须不同:可以是参数个数不同(如 print(String) 和 print(String, String)),也可以是参数类型不同(如 get(int) 和 get(String)),甚至参数顺序不同(如 swap(int, String) 和 swap(String, int))。
重写要求参数列表必须完全一致:包括类型、个数、顺序,一个都不能改。改了就不是重写,而是重载(如果在子类里定义了新参数的方法),或者干脆是另一个无关方法。
其他关键差异点
返回类型:重载对返回值类型无要求,可以相同也可以不同;重写则要求返回类型必须相同,或为父类返回类型的子类(协变返回类型)。
访问修饰符:重载不受限制;重写时子类方法的访问权限不能比父类更严格(例如父类是 protected,子类不能是 private)。
异常声明:重载可任意抛出异常;重写时子类不能抛出比父类更宽泛的检查异常(如父类抛 IOException,子类只能抛 FileNotFoundException 或不抛)。
常见误区提醒
仅靠返回值不同无法构成重载——编译器不认,会报错。
private、static、final 方法不能被重写,但可以在子类中定义同名方法(那只是新方法,不是重写)。
构造方法可以重载,但永远不能重写(因为构造方法不会被继承)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











