多态是面向对象编程中的一个重要概念,它允许不同类型的对象对同一个消息做出不同的响应。在Java编程中,多态性通过方法重写(Override)和方法重载(Overload)来实现。
1. 方法重写(Override):子类可以重写(覆盖)父类的方法,以改变方法的实现细节。重写的方法具有相同的名称、参数列表和返回类型。通过重写,子类可以提供自己的实现逻辑,而不是直接继承父类的实现。当父类的引用指向子类的对象时,调用相同的方法会执行子类的重写方法。
class Animal {
public void makeSound() {
System.out.println("Animal makes sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.makeSound(); // 输出: Dog barks
}
}
2. 方法重载(Overload):在同一个类中,可以定义多个方法具有相同的名称,但参数列表不同。这些方法可以执行相似的操作,但具有不同的输入。编译器根据传入的参数类型和数量来决定调用哪个方法。
class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator calculator = new Calculator();
int sum1 = calculator.add(2, 3); // 调用int版本的add方法
double sum2 = calculator.add(2.5, 3.7); // 调用double版本的add方法
}
}
多态性在Java中有许多应用场景,其中最常见的是使用父类的引用指向子类的对象,以实现对不同子类的统一处理。这样做可以提高代码的灵活性和可扩展性,使程序更易于维护和扩展。
class Shape {
public void draw() {
System.out.println("Drawing a shape");
}
}
class Circle extends Shape {
@Override
public void draw() {
System.out.println("Drawing a circle");
}
}
class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("Drawing a rectangle");
}
}
public class Main {
public static void main(String[] args) {
Shape shape1 = new Circle();
Shape shape2 = new Rectangle();
shape1.draw(); // 输出: Drawing a circle
shape2.draw(); // 输出: Drawing a rectangle
}
}
在上述示例中,Shape类是父类,Circle和Rectangle类是其子类。通过父类的引用指向不同的子类对象,可以调用它们各自的draw()方法,实现了对不同形状的统一处理。这种多态性的应用使得代码更具灵活性,当新增一种形状时,只需要扩展Shape类的子类即可,不需要修改原有的代码逻辑。