Java面向对象 多态

什么是多态

在面向对象编程中,多态是指同一个方法可以根据对象的不同类型表现出不同的行为。简单来说,多态允许我们用不同的方式去实现同一个方法。

多态的实现

在Java中,多态是通过继承和方法重写来实现的。当一个子类继承了父类并重写了父类的方法时,我们可以用子类的对象来调用这个方法,这样就实现了多态。

实例

假设我们有一个Animal类作为父类,有一个Dog类和一个Cat类作为其子类。Animal类有一个makeSound方法,DogCat类分别重写了makeSound方法。

public class Animal {
    public void makeSound() {
        System.out.println("动物发出了声音");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("汪汪汪");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("喵喵喵");
    }
}

我们可以创建一个Animal类型的变量,然后用DogCat类的对象来赋值。这样,当调用makeSound方法时,根据对象的不同类型,将会输出相应的声音。

Animal animal1 = new Dog();
Animal animal2 = new Cat();

animal1.makeSound(); // 输出:汪汪汪
animal2.makeSound(); // 输出:喵喵喵

多态的好处

代码重用

通过多态,我们可以使用父类的引用来引用子类的对象,这就使得代码的重用性大大增加。我们可以在不修改父类的情况下,为不同的子类提供不同的实现。

简化代码

多态让我们能够使用统一的接口来处理不同类型的对象,这样就可以大大简化代码。我们不再需要为每个具体的子类编写特定的代码,只需要对父类进行操作即可。

可扩展性

通过多态,我们可以很方便地扩展代码。当我们需要添加新的子类时,只需要继承父类并重写相应的方法,不需要修改已有的代码。

多态的应用场景

多态在实际的软件开发中有着广泛的应用场景。下面我们来看几个常见的例子。

图形的绘制

假设我们有一个Shape类作为父类,有一个Circle类和一个Rectangle类作为其子类。Shape类有一个draw方法,CircleRectangle类分别重写了draw方法。

public class Shape {
    public void draw() {
        System.out.println("绘制了一个形状");
    }
}

public class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("绘制了一个圆形");
    }
}

public class Rectangle extends Shape {
    @Override
    public void draw() {
        System.out.println("绘制了一个矩形");
    }
}

我们可以创建一个Shape类型的数组,然后用CircleRectangle类的对象来赋值。这样,当调用draw方法时,根据对象的不同类型,将会绘制相应的图形。

Shape[] shapes = new Shape[2];
shapes[0] = new Circle();
shapes[1] = new Rectangle();

for (Shape shape : shapes) {
    shape.draw();
}

输出结果为:

绘制了一个圆形
绘制了一个矩形

消息通知

假设我们有一个Notification类作为父类,有一个EmailNotification类和一个SMSNotification类作为其子类。Notification类有一个send方法,EmailNotificationSMSNotification类分别重写了send方法。

public class Notification {
    public void send() {
        System.out.println("发送了一条通知");
    }
}

public class EmailNotification extends Notification {
    @Override
    public void send() {