Java多态指的是同一个行为具有多个不同表现形式或形态的能力,它让程序在运行时能够根据对象的实际类型来调用对应的方法,是面向对象编程中提升代码灵活性的重要特性。

Java多态的实现条件
要实现Java多态,需要满足三个核心条件,缺少任何一个都无法触发多态效果:
- 存在继承关系:子类需要继承父类或者使用接口实现
- 子类重写父类方法:子类需要对父类中的非静态、非final、非private方法进行重写
- 父类引用指向子类对象:声明时变量类型为父类,实际赋值为子类实例
基础代码示例演示多态
下面通过一个动物类的继承体系来展示多态的基础表现,首先定义父类Animal:
// 父类Animal
class Animal {
// 父类的方法,子类会重写这个方法
public void makeSound() {
System.out.println("动物发出声音");
}
}
接着定义两个子类Dog和Cat,分别重写makeSound方法:
// 子类Dog继承Animal
class Dog extends Animal {
// 重写父类的makeSound方法
@Override
public void makeSound() {
System.out.println("汪汪汪");
}
}
// 子类Cat继承Animal
class Cat extends Animal {
// 重写父类的makeSound方法
@Override
public void makeSound() {
System.out.println("喵喵喵");
}
}
最后编写测试类,通过父类引用指向不同子类对象,观察方法调用的结果:
public class PolymorphismTest {
public static void main(String[] args) {
// 父类引用指向Dog子类对象
Animal animal1 = new Dog();
// 父类引用指向Cat子类对象
Animal animal2 = new Cat();
// 调用同一个方法,实际执行的是子类重写后的逻辑
animal1.makeSound();
animal2.makeSound();
}
}
运行上述代码后,输出结果会是:
汪汪汪 喵喵喵
可以看到,虽然animal1和animal2的声明类型都是Animal,但实际调用makeSound方法时,会根据对象的实际类型执行对应子类的重写方法,这就是多态的典型表现。
多态在方法参数中的应用
多态还可以让方法的参数更通用,不需要为每一个子类单独编写方法,下面看一个示例:
public class AnimalService {
// 方法参数是父类类型,可以接收所有子类对象
public void letAnimalSound(Animal animal) {
animal.makeSound();
}
public static void main(String[] args) {
AnimalService service = new AnimalService();
// 传入Dog实例
service.letAnimalSound(new Dog());
// 传入Cat实例
service.letAnimalSound(new Cat());
}
}
运行后输出和之前一致,这种方式让代码扩展性更强,后续如果需要新增Bird子类,只需要让Bird继承Animal并重写makeSound方法,不需要修改letAnimalSound方法的逻辑。
多态的注意事项
使用多态时需要注意几个常见的问题:
- 父类引用不能直接调用子类特有的方法,如果需要调用,需要进行向下转型,转型前最好用instanceof判断类型,避免类型转换异常
- 静态方法不支持多态,因为静态方法属于类,不会被子类重写,调用时看引用类型而不是实际对象类型
- final修饰的方法不能被重写,因此也无法触发多态效果
下面展示向下转型的正确示例:
public class DowncastTest {
public static void main(String[] args) {
Animal animal = new Dog();
// 判断实际类型后再向下转型
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
// 调用Dog类特有的方法
dog.guardHouse();
}
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("汪汪汪");
}
// Dog类特有的方法
public void guardHouse() {
System.out.println("狗狗在看家");
}
}
通过上述代码示例可以清晰看到,Java多态的核心就是运行期根据实际对象类型动态绑定方法,合理利用多态可以让代码更灵活、更易扩展,是Java开发中必须掌握的核心特性。