Java多态的表现形式
在Java中,多态是面向对象编程的一个重要概念。它允许我们使用统一的接口来处理不同类型的对象,使得代码更加灵活、可扩展和易于维护。本文将介绍Java中多态的表现形式,并通过代码示例来说明其工作原理。
什么是多态
多态是指同一个方法调用可以有多种不同的表现形式。具体来说,当一个基类的引用指向子类的对象时,我们可以通过基类引用调用子类覆盖的方法。这种特性使得代码能够根据实际对象的类型来确定调用哪个方法,从而实现了多态。
多态的表现形式
在Java中,多态有以下几种表现形式:
- 方法重写(Override):子类可以覆盖父类的方法,并且通过父类的引用调用子类的方法。
- 抽象类与接口:通过抽象类和接口定义统一的方法签名,然后由不同的子类实现这些方法,并通过父类或接口的引用调用子类实现的方法。
- 泛型:通过泛型参数化类型,我们可以编写通用的代码,能够适用于不同类型的对象。
接下来,我们通过代码示例来演示这些多态的表现形式。
方法重写
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
类和两个子类Dog
和Cat
。Dog
和Cat
都覆盖了Animal
类中的sound
方法。在main
方法中,我们使用Animal
类的引用分别指向Dog
和Cat
对象,并调用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
接口,并在Circle
和Rectangle
类中实现了getArea
方法。在main
方法中,我们使用Shape
接口的引用分别指向Circle
和Rectangle
对象,并调用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<>();