方法重载(Overloading)
- 定义:在同一个类中,允许存在多个方法名相同,但参数列表不同(参数个数、参数类型或参数顺序不同)的方法。
- 规则:
- 方法名必须相同。
- 参数列表必须不同(参数个数、类型或顺序至少有一个不同)。
- 返回类型可以相同也可以不同,不能仅依靠返回类型不同来重载方法。
- 访问修饰符可以不同。
- 发生场景:常用于对同一类行为进行多样化的操作,例如根据不同的参数类型或个数执行不同的逻辑。
- 代码示例:
public class OverloadingExample {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
方法重写(Overriding)
- 定义:子类对父类中已有的方法进行重新实现。
- 规则:
- 方法名、参数列表、返回类型(Java 5.0 后支持协变返回类型,即子类重写方法的返回类型可以是父类被重写方法返回类型的子类)必须与父类中被重写的方法完全相同。
- 访问修饰符的限制不能比父类中被重写方法的更严格,可以相同或更宽松(例如父类方法是 protected,子类重写方法可以是 protected 或 public)。
- 不能重写父类中声明为 final 的方法。
- 重写方法不能抛出比父类被重写方法更多的异常,或者可以抛出父类被重写方法异常类型的子类异常(可以不抛出异常)。
- 发生场景:当子类需要对父类的某个行为进行特殊化或优化时使用。
- 代码示例:
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}