1.是什么
在Java中,方法的重载(Overloading)和重写(Overriding)是两个不同的概念,它们用于实现不同的目的和功能。以下是方法重载和方法重写的区别:
方法重载(Overloading)
方法重载是指在同一个类中定义多个方法,这些方法具有相同的名字但参数列表不同。重载方法允许程序调用具有不同参数列表的方法,从而实现相同操作的不同方式。
特点:
- 方法名相同:所有重载方法必须具有相同的名字。
- 参数列表不同:每个重载方法必须有不同的参数列表,这意味着参数的类型、数量或顺序必须不同。
- 返回类型可以相同也可以不同:重载方法可以有相同的返回类型,也可以有不同的返回类型。
- 方法可以有默认参数:Java 8及以后版本允许方法有默认参数,但即使有默认参数,只要参数列表不同,方法仍然是重载的。
- 作用域可以不同:重载方法可以有不同作用域,如
public
、private
、protected
等。
示例:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public String add(String a, String b) {
return a + b;
}
}
在这个例子中,Calculator
类定义了三个add
方法,每个方法都有不同的参数列表。
方法重写(Overriding)
方法重写是指子类提供与父类方法具有相同名字和参数列表的方法。重写方法允许子类提供与父类相同操作的不同实现。
特点:
- 方法名相同:所有重写方法必须具有相同的名字。
- 参数列表相同:重写方法的参数列表必须与父类方法完全相同。
- 返回类型可以不同:重写方法的返回类型必须与父类方法的返回类型相同,或者可以更具体(如父类是
int
,子类可以是Integer
)。 - 访问权限可以不同:重写方法可以有更高的访问权限(如父类是
protected
,子类可以是public
)。 - 抛出异常可以不同:重写方法可以抛出与父类方法不同的异常,或者不抛出任何异常。
示例:
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");
}
}
在这个例子中,Dog
类重写了Animal
类的makeSound
方法,提供了不同的实现。
总结:
区别点 | 重载(Overloading) | 重写(Overriding) |
---|---|---|
发生位置 | 同一个类中 | 父类与子类之间 |
参数列表 | 必须不同(参数个数、类型或顺序不同) | 必须相同 |
返回类型 | 可以相同,也可以不同 | 必须相同(Java 5 之后,允许返回类型是协变类型) |
方法名 | 相同 | 相同 |
修饰符 | 无限制 | 访问修饰符不能比父类的更严格 |
多态性 | 编译时多态性 | 运行时多态性 |
与继承的关系 | 与继承无关 | 与继承相关,子类重写父类的方法 |
目的 | 提供同一个方法名的多个实现,以处理不同类型或数量的参数 | 子类定制父类方法的行为 |
典型应用场景
-
重载(Overloading):
- 重载通常用于同一个类中提供多种方式的功能。例如,
println()
方法有多个重载版本,接受不同的参数类型(如int
、double
、String
等)。
- 重载通常用于同一个类中提供多种方式的功能。例如,
-
重写(Overriding):
- 重写用于子类根据自身的需求来定制化父类的行为。例如,
toString()
方法通常会在子类中重写,以提供类的自定义字符串表示形式。
- 重写用于子类根据自身的需求来定制化父类的行为。例如,