Skip to content

2026-08-27 · 同一个方法,不同对象表现出不同行为——面向对象最实用的特性,Spring 的接口注入就是靠它。

Java 多态

1. 多态的概念

同一个方法调用,根据对象的实际类型,执行不同的实现:

java
public class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

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 a1 = new Dog();
Animal a2 = new Cat();
a1.makeSound(); // 汪汪汪!(实际执行 Dog 的方法)
a2.makeSound(); // 喵喵喵!(实际执行 Cat 的方法)

Animal a = new Dog():编译时看左边(Animal 类型),运行时看右边(Dog 对象)。

2. 向上转型(Upcasting)

子类对象赋给父类引用,自动完成:

java
Animal a = new Dog();  // 自动向上转型(不需要强制转换)
a.makeSound();         // ✅ 能调用父类的方法(运行时执行子类重写的)
a.bark();              // ❌ 编译报错:Animal 类没有 bark() 方法

向上转型规则

  • 自动完成,不用强制转换
  • 只能调用父类声明的方法(编译看左边)
  • 实际执行子类重写的方法(运行看右边)

这是多态的基础。方法参数用父类类型接收各种子类对象,才能实现"一个方法多种行为"。

3. 多态的实际应用

集合存不同类型的对象

java
List<Animal> animals = new ArrayList<>();  // 父类类型集合
animals.add(new Dog());
animals.add(new Cat());

for (Animal a : animals) {
    a.makeSound();  // 多态:每个对象执行自己的版本
}

Spring Boot 中的多态

java
// 接口
public interface UserService {
    void save(User user);
}

// 实现类
public class UserServiceImpl implements UserService {
    @Override
    public void save(User user) { /* 具体逻辑 */ }
}

// 使用(Spring 自动注入)
@Service
public class UserController {
    private UserService userService;  // 用接口类型(多态)

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;  // Spring 传入的是 UserServiceImpl
    }

    public void save(User user) {
        userService.save(user);  // 多态调用
    }
}

Spring Boot 的核心设计就是多态:接口定义规范,实现类提供具体逻辑,Spring 容器自动把实现类注入到接口类型的变量中。现在理解多态,后面学 Spring 会轻松很多。