一、多态

1.多态的条件:

继承,重写,向上转换

2.多态的分类:

编译时多态–编译期就知道要调用哪个方法即重载(静多态)

运行时多态–只有在运行时才能知道要调用哪个方法(动多态)

3.多态的实现

JVM执行字节码文件---->读取字节码文件,将字节码文件中的二进制字节流转换为运行时数据结构---->

多态java向上和向下 java多态的底层原理_子类


多态java向上和向下 java多态的底层原理_抽象类_02


先从操作栈中找到对象的实际类型 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、类只能继承一个抽象类,但可以同时实现多个接口