先认真阅读重载和重写的意思和区别,再看下面的代码,很容易理解的。
Java中的重写(Override)和重载(Overload)是面向对象编程中实现多态性的两种重要机制,但它们的作用和应用场景有所不同。
重写(Override)
重写是指子类中出现了一个方法,该方法的名称、返回类型和参数列表与父类中的某个方法完全相同。子类通过重写父类的方法,可以给出自己特有的实现,从而改变父类的行为。重写的关键在于实现接口的多态性和提升代码的可维护性。比如在开发过程中,我们写一个Service接口,然后再写一个ServiceImpl实现类来实现Service中的方法。
重写规则:
- 方法名、参数列表必须一致:子类方法的名称和参数列表必须与父类被重写的方法完全匹配。
- 访问权限不能更严格:子类重写的方法的访问权限修饰符至少要和父类方法一样开放(public > protected > 默认 > private)。
- 返回类型兼容:子类方法的返回类型必须与父类方法相同,或者是父类返回类型的子类型(协变返回类型)。
- 异常规定:子类方法抛出的异常类型不能比父类方法声明的更广泛,可以相同或更窄,也可以不抛出异常。
- 建议使用@Override注解标明:可以提示编译器检查该方法是否正确重写了父类或实现了接口的方法。
重载(Overload)
重载发生在同一个类内,指允许存在多个同名方法,这些方法的参数列表不同(参数个数不同、参数类型不同或参数顺序不同),与返回类型无关。重载提供了调用灵活性,使得同一个方法名可以根据不同的输入参数执行不同的逻辑。
重载规则:
- 方法名相同:重载的方法必须具有相同的名字。
- 参数列表不同:参数的个数、类型或顺序至少有一项不同。
- 返回类型不作为区分条件:重载方法的返回类型可以不同,但这不是重载的依据。
// 重写示例
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
// 重载示例
class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
看完上面的代码,再回去看一遍重写和重载的意思和区别,怎么样是不是很简单。