在Java中,泛型和接口是实现多态的两种主要方法。下面分别介绍这两种方法:
泛型类允许你在类定义时指定一个或多个类型参数。这些类型参数可以在类的方法和属性中使用。当你创建一个泛型类的实例时,可以为这些类型参数提供具体的类型。这样,你可以使用相同的泛型类来创建不同类型的对象,从而实现多态。
例如,假设你有一个泛型类Box<T>
,它可以存储任何类型的对象。你可以创建一个Box<Integer>
实例来存储整数,以及一个Box<String>
实例来存储字符串。这就是多态的体现。
public class Box<T> {
private T item;
public void set(T item) {
this.item = item;
}
public T get() {
return item;
}
}
public class Main {
public static void main(String[] args) {
Box<Integer> intBox = new Box<>();
intBox.set(42);
System.out.println("Integer: " + intBox.get());
Box<String> strBox = new Box<>();
strBox.set("Hello, world!");
System.out.println("String: " + strBox.get());
}
}
接口是一种定义行为的契约,它允许你创建多个实现该接口的类。这些类可以具有相同的方法签名,但可以实现不同的功能。通过使用接口,你可以实现多态,因为你可以将一个接口类型的变量分配给实现该接口的任何类的实例。
例如,假设你有一个接口Drawable
,它定义了一个名为draw
的方法。你可以创建多个实现Drawable
接口的类,如Circle
和Rectangle
。然后,你可以创建一个Drawable
类型的变量,并将其分配给Circle
或Rectangle
的实例,从而实现多态。
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing a circle");
}
}
public class Rectangle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing a rectangle");
}
}
public class Main {
public static void main(String[] args) {
Drawable shape = new Circle();
shape.draw(); // 输出 "Drawing a circle"
shape = new Rectangle();
shape.draw(); // 输出 "Drawing a rectangle"
}
}
总之,Java中的泛型和接口是实现多态的两种重要方法。通过使用它们,你可以编写更灵活、可扩展和可重用的代码。