1. 多态的定义与前提
定义:
多态是面向对象编程中继承或实现关系下的一种现象,表现为对象多态和行为多态。
代码体现:
// 父类引用指向子类对象
People p1 = new Student();
p1.run(); // 调用 Student 的 run() 方法
People p2 = new Teacher();
p2.run(); // 调用 Teacher 的 run() 方法
前提条件:
- 存在继承或实现关系。
- 存在父类引用指向子类对象。
- 存在方法重写(行为多态的核心)!!!!
2. 多态的具体表现
2.1 对象多态与行为多态
- 对象多态:同一父类引用可以指向不同子类对象。
- 行为多态:同一方法调用在不同子类中有不同实现。
示例代码:
public class Test {
public static void main(String[] args) {
// 父类引用指向子类对象
Animal a1 = new Wolf();
a1.run(); // 执行 Wolf 的 run() 方法
System.out.println(a1.name); // 输出 Animal 的 name(成员变量编译和运行都看左边)
Animal a2 = new Tortoise();
a2.run(); // 执行 Tortoise 的 run() 方法
System.out.println(a2.name); // 输出 Animal 的 name
}
// 同一方法调用不同的子类
// 使用父类形参可接收任意子类对象
public void MethodDemo(Animal a){
a.run
}
}
规则总结:
- 成员方法:编译看左边(父类),运行看右边(子类)。
- 成员变量:编译和运行都看左边(父类)。
3. 多态下的类型转换
3.1 自动类型转换(向上转型)
- 父类引用可以直接接收子类对象。
People p = new Teacher(); // 自动类型转换
3.2 强制类型转换(向下转型)
- 将父类引用强制转换为子类类型,需使用强制类型转换语法。
Teacher t = (Teacher) p; // 强制类型转换
注意事项:
- 编译检查:存在继承关系即可编译通过。
- 运行时风险:若对象真实类型与强转类型不符,抛出
ClassCastException。People p = new Teacher(); Student s = (Student) p; // 运行时异常:ClassCastException
3.3 安全转换:instanceof 关键字
- 在强转前使用
instanceof检查对象真实类型。
if (p instanceof Student) {
Student s = (Student) p; // 安全转换
}
4. 多态的好处与局限性
4.1 核心优势
- 解耦与扩展性:
父类引用可接收任意子类对象,降低代码耦合度,便于扩展。public void showInfo(People p) { p.run(); // 可接收 Student、Teacher 等子类对象 } public void MethodDemo(Animal a){ a.run }
4.2 局限性
- 无法访问子类独有功能:
父类引用无法直接调用子类特有的方法或变量。
解决方案:People p = new Student(); p.study(); // 编译报错!People 类中无 study() 方法
通过强制类型转换为子类后调用。
5. 多态的最佳实践
- 优先使用向上转型:通过父类引用操作子类对象,提高代码通用性。
- 慎用向下转型:必须使用
instanceof进行类型检查,避免运行时异常。 - 合理设计方法重写:确保子类方法覆盖父类逻辑,实现行为多态。
示例:多态在集合中的应用
List<String> list = new ArrayList<>(); // 多态体现:List 引用指向 ArrayList 对象
list.add("Java");
list = new LinkedList<>(); // 切换为 LinkedList 实现
list.add("Python");
6. 总结
- 核心机制:多态通过继承和方法重写实现代码的灵活性与扩展性。
- 类型转换:向上转型自动完成,向下转型需显式操作并确保类型安全。
- 应用场景:框架设计、接口回调、集合类库等高频使用多态提升扩展性。
关键口诀:
- 成员变量:编译运行都看左。
- 成员方法:编译看左,运行看右。
- 强转之前,必查类型!

被折叠的 条评论
为什么被折叠?



