在Java中,方法重载(Method Overloading)和方法重写(Method Overriding)是两个非常核心的概念,它们都是实现多态性的方式,但应用场景和规则有所区别。
方法重载(Method Overloading)
方法重载是指在同一个类中定义多个名称相同但参数列表不同的方法。通过这种方式,相同名称的方法可以根据不同的参数列表执行不同的功能。重载是实现编译时多态或静态多态的一种方式。
规则:
- 方法名称必须相同。
- 参数列表必须不同(参数的数量、类型或者参数的顺序)。
- 方法的返回类型和访问修饰符可以不同。
- 仅仅返回类型不同不足以构成方法重载,这会引发编译错误。
示例:
class Demo {
// 方法重载的第一个方法
void display(int a) {
System.out.println("Got an integer: " + a);
}
// 方法重载的第二个方法
void display(int a, int b) {
System.out.println("Got two integers: " + a + " and " + b);
}
// 方法重载的第三个方法
void display(String a) {
System.out.println("Got a String: " + a);
}
}
public class Test {
public static void main(String[] args) {
Demo demo = new Demo();
demo.display(1); // 调用第一个方法
demo.display(1, 2); // 调用第二个方法
demo.display("Hello"); // 调用第三个方法
}
}
方法重写(Method Overriding)
方法重写是子类重写父类的方法。当子类需要提供父类方法的特定实现时使用。方法重写是实现运行时多态或动态多态的一种方式。
规则:
- 方法名称和参数列表必须完全相同。
- 返回类型必须相同或者是子类型(Java 5及更高版本允许协变返回类型)。
- 访问修饰符的限制级别不能比父类方法更严格。
- 子类方法不能抛出新的检查型异常或者比父类方法更广的检查型异常。
- 只有实例方法才能被重写,静态方法不能被重写而是被隐藏。
- 重写的方法可以使用
@Override
注解标记,以确保正确覆盖了父类方法。
示例:
class Animal {
void eat() {
System.out.println("This animal eats food.");
}
}
class Dog extends Animal {
// 方法重写
@Override
void eat() {
System.out.println("Dog eats meat.");
}
}
public class Test {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.eat(); // 输出: Dog eats meat.
}
}
总结来说,方法重载体现在一个类的多个方法之间,关注点在于拓展方法的可用性;而方法重写体现在子类与父类之间,关注点在于提供特定的行为实现。这两者都是Java中实现多态的重要机制。