Java 多态学习笔记

多态(Polymorphism)是面向对象程序设计中的一个重要概念,它允许不同的对象对同一消息做出响应。在 Java 中,多态可以通过两种方式实现:方法重载(Overloading)和方法重写(Overriding)。

方法重载

方法重载指的是定义了多个名称相同但参数列表不同的方法。这些方法可以有不同的返回类型,但不能仅仅是返回类型不同而已。在调用方法时,编译器会根据传入的参数自动匹配对应的方法。

下面是一个简单的例子:

javaCopy Code
public class PolymorphismExample { public void print(int num) { System.out.println("Print int: " + num); } public void print(String str) { System.out.println("Print string: " + str); } }

在上面的例子中,我们定义了两个名称相同但参数列表不同的方法。在调用这两个方法时,编译器会根据传入的参数自动匹配对应的方法。例如:

javaCopy Code
PolymorphismExample example = new PolymorphismExample(); example.print(1); // Print int: 1 example.print("hello"); // Print string: hello

方法重写

方法重写指的是在子类中重新定义父类中已有的方法。子类中的方法必须与父类中的方法具有相同的名称、参数列表和返回类型。这种方式实现的多态,又称为运行时多态。

下面是一个简单的例子:

javaCopy Code
public class Animal { public void move() { System.out.println("Animal move"); } } public class Dog extends Animal { @Override public void move() { System.out.println("Dog move"); } }

在上面的例子中,我们定义了一个 Animal 类和一个 Dog 类,并在 Dog 类中重写了 move 方法。在调用 move 方法时,编译器会根据变量的实际类型(而不是声明类型)来确定调用哪个方法。例如:

javaCopy Code
Animal animal = new Dog(); animal.move(); // Dog move

在上面的例子中,变量 animal 的声明类型是 Animal,但其实际类型是 Dog。因此,调用 move 方法时会调用 Dog 类中重写的 move 方法。

实例

下面我们以一个简单的图形类为例,演示如何使用多态来实现代码的灵活性。

javaCopy Code
public abstract class Shape { public abstract double area(); } public class Rectangle extends Shape { private double width; private double height; public Rectangle(double width, double height) { this.width = width; this.height = height; } @Override public double area() { return width * height; } } public class Circle extends Shape { private double radius; public Circle(double radius) { this.radius = radius; } @Override public double area() { return Math.PI * radius * radius; } }

在上面的例子中,我们定义了一个抽象类 Shape 和两个具体的图形类 RectangleCircle。其中 Shape 类定义了一个抽象方法 area,用于计算图形的面积。

现在,我们需要编写一个方法来计算多个图形的面积总和。我们可以使用方法重载来实现:

javaCopy Code
public class ShapeUtils { public static double calculateArea(Shape[] shapes) { double total = 0; for (Shape shape : shapes) { total += shape.area(); } return total; } }

在上面的例子中,我们编写了一个静态方法 calculateArea,用于计算传入的图形数组中所有图形的面积总和。由于 Shape 类定义了抽象方法 area,因此我们可以使用多态来处理不同类型的图形。

现在,我们就可以愉快地使用多态来计算各种类型的图形的面积总和了。例如:

javaCopy Code
Shape[] shapes = new Shape[2]; shapes[0] = new Rectangle(10, 20); shapes[1] = new Circle(5); double totalArea = ShapeUtils.calculateArea(shapes); System.out.println("Total area: " + totalArea);

在上面的例子中,我们创建了一个包含 RectangleCircle 两种图形的数组,并调用了 ShapeUtils 类中的方法来计算它们的面积总和。由于 calculateArea 方法中使用了多态,因此我们可以处理这两种不同类型的图形。