重载和重写有什么区别?
重载和重写的区别
在面向对象程序设计中,重载(Overloading)和重写(Overriding)是两个重要的概念。它们分别用于描述在不同的情况下如何使用相同的名称来定义函数或方法。虽然它们都涉及到函数或方法,但它们的目的和使用方式有所不同。
1. 重载(Overloading)
重载是指在同一个类中定义多个同名的函数或方法,但它们的参数列表必须不同。可以通过参数的个数、类型或顺序来区分这些同名函数或方法,使其具有不同的行为。重载的主要作用是提高代码的可读性和灵活性。
例如,我们可以定义一个名为sum的函数,在该函数中可以传入两个整数、两个浮点数或者一个整数和一个浮点数,通过参数的类型来调用不同的函数实现:
```java public class Calculation { public int sum(int num1, int num2) { return num1 + num2; } public double sum(double num1, double num2) { return num1 + num2; } public double sum(int num1, double num2) { return num1 + num2; } } ```以上就是重载的示例,在同一个类中我们定义了三个名为sum的函数,它们的参数类型分别为两个整数、两个浮点数以及一个整数和一个浮点数。
2. 重写(Overriding)
重写是指子类对父类中已有的方法进行重新定义,要求子类方法的名称、返回值类型和参数列表与父类方法完全相同。通过重写,子类可以根据自身的需求来实现特定的功能,而不需要重新编写父类中已有的代码。重写的主要目的是实现多态性。
例如,我们定义一个名为Animal的父类,其中包含一个eat方法:
```java public class Animal { public void eat() { System.out.println("Animal is eating."); } } ```然后我们定义一个名为Dog的子类,它继承自Animal类并重写了eat方法:
```java public class Dog extends Animal { @Override public void eat() { System.out.println("Dog is eating bones."); } } ```在这个例子中,子类Dog重新定义了eat方法,使得当我们在程序中调用Dog对象的eat方法时,会输出"Dog is eating bones."。而如果调用Animal对象的eat方法,则会输出"Animal is eating."。这就是重写的效果。
需要注意的是,重写只能发生在子类和父类之间,并且子类方法必须具有更低的访问权限(即不能更严格,例如,父类方法为public,子类方法可以是public或protected)。另外,重写时不能修改方法的返回值类型,但可以使用covariant返回类型(即可以返回父类方法返回值类型的子类类型)。
重载和重写是两个不同的概念。重载是指在同一个类中定义多个同名的方法,它们的参数列表必须不同;而重写是指子类对父类中已有的方法进行重新定义,要求子类方法的名称、返回值类型和参数列表与父类方法完全相同。通过重载和重写,我们可以在不同的情况下使用相同的名称来定义函数或方法,提高代码的可读性和灵活性,同时实现多态性。