在面向对象编程(OOP)中,重写(Overriding)和重载(Overloading)是两个重要的概念,它们都与类的多态性(Polymorphism)有关,但它们之间存在明显的区别。
重载(Overloading)
重载指的是在同一个类中,可以有多个同名的方法,只要它们的参数列表不同即可。参数列表的不同可以是参数的类型不同、参数的数量不同,或者是参数的顺序不同。重载是编译时多态的一个例子,因为调用哪个重载方法是在编译时决定的。
重载的特点:
- 方法名相同:重载的方法必须有相同的名字。
- 参数列表不同:可以是参数的数量、类型或顺序不同。
- 返回类型可变:重载的方法可以有不同的返回类型。
- 访问修饰符可变:重载的方法可以有不同的访问修饰符。
- 编译时决策:编译器根据方法的签名(方法名和参数列表)来决定调用哪个方法。
重载的例子:
public class Calculator { // 加法方法重载 public int add(int a, int b) { return a b; } // 加法方法重载,参数类型不同 public double add(double a, double b) { return a b; } }
重写(Overriding)
重写是指子类中的方法可以与父类中相同名字和参数列表的方法具有相同的实现,或者具有不同的实现。重写是运行时多态的一个例子,因为调用哪个重写方法是在运行时决定的,这依赖于对象的实际类型。
重写的特点:
- 方法名和参数列表相同:重写的方法必须与被重写的方法具有相同的方法名和参数列表。
- 返回类型相同或协变:重写的方法的返回类型必须与被重写的方法的返回类型相同,或者是其子类型(协变返回类型)。
- 访问修饰符不变或更宽松:重写的方法的访问修饰符不能比被重写的方法更严格。
- 运行时决策:运行时根据对象的实际类型来决定调用哪个重写方法。
- 必须有继承关系:只有子类可以重写父类的方法。
重写的例子:
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"); } } // 在运行时,Dog对象的sound()方法会被调用 Animal myDog = new Dog(); myDog.sound(); // 输出 "Dog barks"
结论
重载和重写都是面向对象编程中实现多态性的方式,但它们在概念、应用和行为上有明显的区别。重载关注于同一个类中方法的多样性,它是基于方法签名的编译时决策;而重写则是子类对父类方法的重新实现,它是基于对象实际类型的运行时决策。理解这两个概念对于编写灵活、可扩展的面向对象代码至关重要。
版权声明:本页面内容旨在传播知识,为用户自行发布,若有侵权等问题请及时与本网联系,我们将第一时间处理。E-mail:284563525@qq.com