java基础进阶二-多态

本文深入探讨了Java中的多态性,包括继承多态和接口多态。通过实例展示了如何通过父类引用调用子类方法。多态实现依赖于JVM的机制支持,如虚方法表和类加载过程中的解析阶段。在运行时,JVM通过虚方法表确定实际调用哪个子类的方法。实际开发中,接口多态更为常见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态

多态从语法表面来看,就是子类对象可以赋值给父类引用,并通过引用,调用不同子类的方法。
多态的实际用法分为:

  • 继承多态
  • 接口多态
class Son extends Father { 
    @Overrid
    public void smoke() {
        System.out.print("儿子抽烟");
    }
}
class Daughter extends Father {
    @Overrid
    public void smoke() {
        System.out.print("女儿抽烟");
    }
}

// 继承多态,因为Son、Daughter继承了Father
Father obj = new Son();
obj.smoke(); // 打印:儿子抽烟
obj = new Daughter();
obj.smoke(); // 打印:女儿抽烟
class Son implements Swimmer {
    @Overrid
    public void swim() {
        System.out.print("儿子游泳");
    }
}
class Daughter implements Swimmer {
    @Overrid
    public void swim() {
        System.out.print("儿子游泳");
    }
}

// 接口多态,因为Son、Daughter实现了Swimmer
Swimmer obj = new Son();
obj.swim(); // 打印:儿子游泳
obj = new Daughter();
obj.swim(); // 打印:女儿游泳

实际开发接口多态更常用。多态的实现,依赖于2个大方面:
● 机制上的支持
● 编码上的支持

机制上的支持:
首先,编译器要允许这种赋值方式,不然把son赋值给swimmer就会像把 int a赋值给String b一样报错。
其次,运行时要支持并且能通过某种机制找到真正的子类方法。

编码上的支持:
必须存在继承(实现)关系 + 子类必须重写(实现)父类的方法

在这里插入图片描述
那么问题又来了,JVM怎么知道要打印儿子吸烟呢?话句话说就是为什么JVM知道要调用son#smoke(),而不是daughter#smoke()呢?
在这里插入图片描述
这就涉及到了虚方法和需方发表了,JVM有个类加载子系统,专门负责类的加载:
在这里插入图片描述
而在类加载的过程中,有loading、linking和initialization三个阶段,其中linking阶段又包括3个小阶段:

  • 验证
  • 准备
  • 解析
    在解析阶段,JVM会针对类和接口、字段、类方法、接口方法等进行解析,方法信息会形成虚方法表,
    在这里插入图片描述
    也就是说,当出现多态方法调用时,底层会多一次“查表”的过程,也就是通过搜索虚方法表,确定本次实际应该调用的方法(实际指向对象+实例对应的类有无重写父类方法),如果子类Override了父类方法,那么就会执行子类方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值