【JAVA】多态机制的底层原理,抽象类与接口

一、多态
1.多态的条件:
继承,重写,向上转换
2.多态的分类:
编译时多态–编译期就知道要调用哪个方法即重载(静多态)
运行时多态–只有在运行时才能知道要调用哪个方法(动多态)
3.多态的实现
JVM执行字节码文件---->读取字节码文件,将字节码文件中的二进制字节流转换为运行时数据结构---->在这里插入图片描述

先从操作栈中找到对象的实际类型 class;

找到 class 中与被调用方法签名相同的方法,如果有访问权限就返回这个方法的直接引用,如果没有访问权限就报错 ;

如果第 2 步找不到相符的方法,就去搜索 class 的父类,按照继承关系自下而上依次执行第 2 步的操作;

如果第 3 步找不到相符的方法,就报错;

如果子类覆盖了父类的方法,则在多态调用中,动态绑定过程会首先确定实际类型是子类,从而先搜索到子类中的方法。这个过程便是方法覆盖的本质。

实际上,商用虚拟机为了保证性能,通常会使用虚方法表和接口方法表,而不是每次都执行一遍上面的步骤。以虚方法表为例,虚方法表在类加载的解析阶段填充完成,其中存储了所有方法的直接引用。也就是说,动态分派在填充虚方法表的时候就已经完成了。

在子类的虚方法表中,如果子类覆盖了父类的某个方法,则这个方法的直接引用指向子类的实现;而子类没有覆盖的那些方法,比如 Object 的方法,直接引用指向父类或 Object 的实现。

二、抽象类与接口
接口的定义:

  • 特征1:接口表示"含有"关系,抽象类表示"是"关系
  • 特征2:不能使用new操作符去创建对象
  • 特征3:实现类必须重写接口的所有方法,反之,就将该实现类定义为一个抽象类
  • 特征4:类可以继承多个接口,多继承
  • 特征5:接口当中成员变量public static final,成员方法都是public
  • 特征5:接口当中的方法都是只有方法的声明而没有方法体
  • java8(jdk1.8)
  • 特征6:default关键字可以定一个default方法,有方法的实现
  • 特征7:可以定义static的静态方法,有方法的实现
  • 课后练习:static final与final在内存上是有什么不一样的?
    抽象类与接口的区别:
  • 1、抽象类使用 abstract class 来定义,接口用interface来定义,接口表示"含有"关系,抽象类表示"是"关系
  • 2、抽象类可以有抽象方法,也可有普通方法,但接口中只能有抽象方法
  • 3、抽象类中抽象方法必须用abstract来修饰,而访问限制修饰符可以是 public、protected 和默认这三种的任意一种,而接口中的方法其默认属性为abstract 和 public
  • 4、抽象类中的成员变量与非抽象类中的成员变量的定义相同,而接口中的成员变量其默认属性为 public、static、final
  • 5、类只能继承一个抽象类,但可以同时实现多个接口
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值