Appearance
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 会轻松很多。