一、多态
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、类只能继承一个抽象类,但可以同时实现多个接口