同一个方法名可以被不同的对象调用,且可以根据不同的对象类型执行不同的实现,这种特性可以提高代码的灵活性和可扩展性。
具体来说,多态可以通过继承和接口实现。当子类继承父类或实现接口时,它们可以重写父类或接口中的方法,并根据自己的需求实现自己的逻辑。当调用该方法时,根据实际对象的类型,会自动调用相应的实现。
举个例子,假设有一个动物类Animal,它有一个eat()方法:
```java
public class Animal {
public void eat() {
System.out.println("Animal is eating.");
}
}
```
然后有两个子类Cat和Dog,它们继承了Animal类,并且分别重写了eat()方法:
```java
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("Cat is eating fish.");
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("Dog is eating meat.");
}
}
现在我们可以创建一个Animal类型的引用,然后通过它调用eat()方法,如下:
```java
Animal animal = new Cat(); // 创建一个Cat对象,并将它赋给Animal类型的引用
animal.eat(); // 输出:Cat is eating fish.
```
同样地,我们也可以创建一个Dog对象,并调用它的eat()方法:
```java
Animal animal = new Dog(); // 创建一个Dog对象,并将它赋给Animal类型的引用
animal.eat(); // 输出:Dog is eating meat.
```
由于animal变量的类型是Animal,但是它实际引用的是Cat或Dog对象,因此在调用eat()方法时,会自动调用相应的子类实现,这就是Java中的多态。