Java中的多态

1. 多态的定义与前提

定义
多态是面向对象编程中继承或实现关系下的一种现象,表现为对象多态行为多态

代码体现

// 父类引用指向子类对象
People p1 = new Student();
p1.run(); // 调用 Student 的 run() 方法

People p2 = new Teacher();
p2.run(); // 调用 Teacher 的 run() 方法

前提条件

  1. 存在继承或实现关系。
  2. 存在父类引用指向子类对象。
  3. 存在方法重写(行为多态的核心)!!!!

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; // 强制类型转换

注意事项

  1. 编译检查:存在继承关系即可编译通过
  2. 运行时风险:若对象真实类型与强转类型不符,抛出 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. 多态的最佳实践

  1. 优先使用向上转型:通过父类引用操作子类对象,提高代码通用性。
  2. 慎用向下转型:必须使用 instanceof 进行类型检查,避免运行时异常。
  3. 合理设计方法重写确保子类方法覆盖父类逻辑,实现行为多态。

示例:多态在集合中的应用

List<String> list = new ArrayList<>(); // 多态体现:List 引用指向 ArrayList 对象
list.add("Java");
list = new LinkedList<>(); // 切换为 LinkedList 实现
list.add("Python");

6. 总结

  • 核心机制:多态通过继承和方法重写实现代码的灵活性与扩展性。
  • 类型转换:向上转型自动完成,向下转型需显式操作并确保类型安全。
  • 应用场景:框架设计、接口回调、集合类库等高频使用多态提升扩展性。

关键口诀

  • 成员变量:编译运行都看左。
  • 成员方法:编译看左,运行看右。
  • 强转之前,必查类型!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值