Java 多态学习笔记
多态(Polymorphism)是面向对象程序设计中的一个重要概念,它允许不同的对象对同一消息做出响应。在 Java 中,多态可以通过两种方式实现:方法重载(Overloading)和方法重写(Overriding)。
方法重载
方法重载指的是定义了多个名称相同但参数列表不同的方法。这些方法可以有不同的返回类型,但不能仅仅是返回类型不同而已。在调用方法时,编译器会根据传入的参数自动匹配对应的方法。
下面是一个简单的例子:
javaCopy Codepublic 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 CodePolymorphismExample example = new PolymorphismExample();
example.print(1); // Print int: 1
example.print("hello"); // Print string: hello
方法重写
方法重写指的是在子类中重新定义父类中已有的方法。子类中的方法必须与父类中的方法具有相同的名称、参数列表和返回类型。这种方式实现的多态,又称为运行时多态。
下面是一个简单的例子:
javaCopy Codepublic 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 CodeAnimal animal = new Dog();
animal.move(); // Dog move
在上面的例子中,变量 animal
的声明类型是 Animal
,但其实际类型是 Dog
。因此,调用 move
方法时会调用 Dog
类中重写的 move
方法。
实例
下面我们以一个简单的图形类为例,演示如何使用多态来实现代码的灵活性。
javaCopy Codepublic 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
和两个具体的图形类 Rectangle
和 Circle
。其中 Shape
类定义了一个抽象方法 area
,用于计算图形的面积。
现在,我们需要编写一个方法来计算多个图形的面积总和。我们可以使用方法重载来实现:
javaCopy Codepublic class ShapeUtils {
public static double calculateArea(Shape[] shapes) {
double total = 0;
for (Shape shape : shapes) {
total += shape.area();
}
return total;
}
}
在上面的例子中,我们编写了一个静态方法 calculateArea
,用于计算传入的图形数组中所有图形的面积总和。由于 Shape
类定义了抽象方法 area
,因此我们可以使用多态来处理不同类型的图形。
现在,我们就可以愉快地使用多态来计算各种类型的图形的面积总和了。例如:
javaCopy CodeShape[] 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);
在上面的例子中,我们创建了一个包含 Rectangle
和 Circle
两种图形的数组,并调用了 ShapeUtils
类中的方法来计算它们的面积总和。由于 calculateArea
方法中使用了多态,因此我们可以处理这两种不同类型的图形。