Java多态的表现形式

在Java中,多态是面向对象编程的一个重要概念。它允许我们使用统一的接口来处理不同类型的对象,使得代码更加灵活、可扩展和易于维护。本文将介绍Java中多态的表现形式,并通过代码示例来说明其工作原理。

什么是多态

多态是指同一个方法调用可以有多种不同的表现形式。具体来说,当一个基类的引用指向子类的对象时,我们可以通过基类引用调用子类覆盖的方法。这种特性使得代码能够根据实际对象的类型来确定调用哪个方法,从而实现了多态。

多态的表现形式

在Java中,多态有以下几种表现形式:

  1. 方法重写(Override):子类可以覆盖父类的方法,并且通过父类的引用调用子类的方法。
  2. 抽象类与接口:通过抽象类和接口定义统一的方法签名,然后由不同的子类实现这些方法,并通过父类或接口的引用调用子类实现的方法。
  3. 泛型:通过泛型参数化类型,我们可以编写通用的代码,能够适用于不同类型的对象。

接下来,我们通过代码示例来演示这些多态的表现形式。

方法重写

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

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

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

public class PolymorphismExample {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();
        
        animal1.sound(); // 输出:汪汪汪
        animal2.sound(); // 输出:喵喵喵
    }
}

在上面的代码示例中,我们定义了一个Animal类和两个子类DogCatDogCat都覆盖了Animal类中的sound方法。在main方法中,我们使用Animal类的引用分别指向DogCat对象,并调用sound方法。由于多态的存在,最终调用的是子类中覆盖的方法。

抽象类与接口

interface Shape {
    double getArea();
}

class Circle implements Shape {
    private double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    
    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

class Rectangle implements Shape {
    private double width;
    private double height;
    
    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }
    
    @Override
    public double getArea() {
        return width * height;
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        Shape circle = new Circle(5);
        Shape rectangle = new Rectangle(4, 6);
        
        System.out.println("圆的面积:" + circle.getArea()); // 输出:78.53981633974483
        System.out.println("矩形的面积:" + rectangle.getArea()); // 输出:24.0
    }
}

在上面的代码示例中,我们定义了一个Shape接口,并在CircleRectangle类中实现了getArea方法。在main方法中,我们使用Shape接口的引用分别指向CircleRectangle对象,并调用getArea方法。由于多态的存在,我们可以通过统一的接口来处理不同类型的形状对象。

泛型

import java.util.ArrayList;
import java.util.List;

public class PolymorphismExample {
    public static <T> void printList(List<T> list) {
        for (T item : list) {
            System.out.println(item);
        }
    }
    
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        stringList.add("Hello");
        stringList.add("World");
        
        List<Integer> integerList = new ArrayList<>();