除了方法重写,还有以下几种方式可以实现多态:
- 接口实现:通过让不同的类实现同一个接口,这些类可以以各自不同的方式来实现接口中的方法,从而体现多态性。每个实现类都可以有其独特的行为表现。
- 抽象类继承:一个抽象类可以定义一些抽象方法和具体方法。子类继承这个抽象类后,必须实现其中的抽象方法,同时可以根据需要重写具体方法,实现不同的行为,这也是一种多态的体现。
- 方法参数类型的多态性:在方法中接受父类类型的参数,实际传递子类对象。这样,在方法内部可以根据实际对象的类型来执行相应的操作,体现了多态性。
- 对象造型:将子类对象转换为父类对象,然后通过父类引用调用方法。运行时会根据实际对象的类型执行相应的方法,实现多态。
以接口实现多态为例,假设有一个接口Shape
:
public interface Shape {
void draw();
}
然后有两个类Circle
和Square
分别实现这个接口:
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("绘制正方形");
}
}
在使用时,可以创建不同的形状对象,并通过接口引用调用方法:
Shape shape1 = new Circle();
Shape shape2 = new Square();
shape1.draw();
shape2.draw();
在这里,虽然shape1
和shape2
都是Shape
类型的引用,但实际执行的是不同类的draw
方法,体现了多态性。
抽象类继承的方式也类似。假设有一个抽象类Animal
:
public abstract class Animal {
public abstract void makeSound();
}
然后有两个子类Dog
和Cat
继承自它:
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("汪汪汪");
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("喵喵喵");
}
}
在使用时,可以通过抽象类引用调用方法:
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.makeSound();
animal2.makeSound();
同样,根据实际对象的类型执行不同的方法。
方法参数类型的多态性可以通过一个方法接受父类类型的参数来实现。比如有一个方法processShape
:
public void processShape(Shape shape) {
shape.draw();
}
然后可以传递不同的形状对象给这个方法:
processShape(new Circle());
processShape(new Square());
在方法内部,根据实际对象的类型执行相应的操作。
对象造型的方式则是将子类对象转换为父类对象,然后通过父类引用调用方法。比如:
Circle circle = new Circle();
Shape shape = (Shape) circle;
shape.draw();
在这种情况下,运行时会根据实际对象的类型执行相应的方法。
这些多态的实现方式各有特点,在不同的场景中可以灵活运用,以提高代码的灵活性、可扩展性和复用性。