多态
1. 定义
多态是指同一操作或方法在不同的对象上有不同的行为。它使得程序能够使用同样的接口来处理不同的对象,从而提高了代码的可扩展性和可维护性。
2. 类型
- 编译时多态(静态多态): 在编译阶段确定调用的方法,这主要是通过方法的重载实现的。
- 运行时多态(动态多态): 在运行时确定调用的方法,这主要是通过方法的覆写(重写)和虚函数的机制实现的。
3. 示例
class Animal {
void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
void makeSound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
void makeSound() {
System.out.println("Cat meows");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.makeSound(); // 输出:Dog barks
animal2.makeSound(); // 输出:Cat meows
}
}
在上述例子中,Animal
是一个基类,Dog
和 Cat
是它的子类。通过多态,可以使用相同的方法 makeSound()
来处理不同类型的动物对象,实现了代码的可重用性和灵活性。
重载
1. 定义
重载是指在同一个类中,允许定义多个相同名字的方法,但这些方法的参数类型、个数或顺序必须不同。
2. 特点
- 重载是一种编译时多态,编译器根据调用时提供的参数列表选择调用哪个方法。
- 返回类型和访问修饰符不是重载的一部分。
3. 示例
public class OverloadingExample {
void printInfo(int x) {
System.out.println("Printing integer: " + x);
}
void printInfo(String str) {
System.out.println("Printing string: " + str);
}
public static void main(String[] args) {
OverloadingExample example = new OverloadingExample();
example.printInfo(10); // 输出:Printing integer: 10
example.printInfo("Hello"); // 输出:Printing string: Hello
}
}
在上述例子中,OverloadingExample
类中有两个名字相同的方法 printInfo
,但它们的参数类型不同,一个是整数,一个是字符串。编译器在调用时会根据提供的参数选择正确的方法。
区别对比
- 类型: 多态涉及到运行对象的不同(动态),而重载是编译的不同(静态)。
- 实现方式: 多态通过继承和重写实现,而重载通过使用相同方法名但不同参数列表来实现。
- 调用方式: 多态通过对象的实际类型决定调用哪个方法,而重载通过编译器根据提供的参数列表选择调用哪个方法。
总结
在使用中,多态更多地涉及到类之间的继承和接口实现,而重载更多地用于同一个类中定义相同名字的方法时的场景。两者都有助于代码的可读性和可维护性,可以根据具体场景选择使用。