Java方法重载和方法重写
Java方法重载和方法重写
- 在Java中,方法重载(Overloading)和方法重写(Overriding)是两种不同的概念,分别用于实现多态性和代码复用。
1. 方法重载(Overloading)
-
方法重载是指在同一个类中,允许存在多个方法名相同但参数列表不同(参数类型、参数个数或参数顺序不同)的方法。方法重载通过编译时的静态绑定实现。方法重载是编译时多态的一种表现,它通过方法参数的不同来区分方法。
-
特点:
- 方法名相同,但参数列表不同(参数个数、类型、顺序)。
- 返回类型可以相同也可以不同,但是不能仅通过返回类型来区分重载方法。
- 方法重载发生在同一个类中。
-
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14public class MathUtils {
// 方法重载示例
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;
}
}
2. 方法重写(Overriding)
-
方法重写是指在子类中重新实现父类中已经存在的方法,要求方法名、参数列表和返回类型都必须相同。方法重写通过运行时的动态绑定实现。方法重写发生在继承关系中,是运行时多态的一种体现。
-
特点:
- 子类重写父类的方法,方法名、参数列表和返回类型必须相同。
- 只能发生在继承关系中(子类继承父类)。
- 可以改变方法的视线,但不能改变方法签名。
- 运行时多态:方法的调用决定于对象的实际类型,而不是引用类型。
-
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
// 重写父类的 sound 方法
public void sound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
// 重写父类的 sound 方法
public void sound() {
System.out.println("Cat meows");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.sound(); // 输出 Dog barks
myCat.sound(); // 输出 Cat meows
}
}
3. 总结
- 重载和重写的主要区别:
| 特性 | 方法重载(Overloading) | 方法重写(Overriding) |
|---|---|---|
| 定义 | 在同一个类中,方法名相同,参数不同 | 子类重新实现父类的已存在的方法 |
| 发生地点 | 同一类中 | 子类继承父类时发生 |
| 方法签名 | 方法名相同,参数不同 | 方法名相同,参数相同 |
| 返回类型 | 返回类型可以不同(不作为重载的依据) | 返回类型必须相同(或者是子类类型的子类) |
| 访问修饰符 | 子类的访问修饰符可以更宽松(但不能更严格) | 子类的访问修饰符不能更严格,必须是相同或更宽松 |
| 多态类型 | 编译时多态 | 运行时多态 |
| 调用方式 | 通过方法参数来区分调用哪个方法 | 通过对象的实际类型来调用方法 |
