【Java进阶】接口和多态(附JDK8和9新特性)
接口
概述
接口是java中的一种引用数据类型,使用interface关键字表示,里面可以写常量和抽象方法;
- 在JDK7及以前只能写常量及抽象
- 可以简单的把接口理解成一种规范, 谁实现了这个接口就要遵守该规范
JDK7以前
1 | 只能写常量和抽象方法; |
JDK7以后
1 | jdk8新增了默认方法和静态方法,jdk9新增了私有方法; |
为什么使用接口
1 | 接口相当于是"规范",让实现类实现接口之后,相当于"满足了某种规范",让调用者可以根据接口规范,调用实现类中的具体内容; |
什么时候可以使用接口
1 | 任意类中只要有"方法",就可以针对方法,设计出接口; |
如何编写接口
1 | 定义接口使用 interface; |

CodeDemo
1 | // Fly接口 |
多态
多态的明显标志就是:
父类类型的变量 存了 子类类型的对象就叫多态大前提:(3点)
- 有继承或实现关系; 且父类对象引用子类对象; 且存在方法的重写
前提
- 有继承或实现;
- 有方法重写;
- 有父类类型的变量保存了子类类型的对象;
多态代码练习
这里注意几个点
- 多态的三个前提
- 多态的强制类型转换并不会改变对象的地址值(说白了转型来转型去还是一个对象)
- 多态的对象保存的是子类重写父类后的方法(编译看左, 运行看右)
- 对于成员变量来说, 是编译看左, 运行看左

多态的好处
多态的好处体现在员工类(形参位置为Animal a) 的这个类, 实现了父类类型保存子类对象的用途.
从而进一步实现了每次传入一个子类对象就能调用执行子类重写的方法.

CodeDemo

1 | // Animal抽象类 |
多态的弊端
不能使用多态的对象,调用与该状态无关的方法!
解决弊端的办法
1 | 利用强制类型转换,将多态形式的对象,转成子类本身类型即可; |
避免强制类型转换异常的办法
1 | 使用 instanceof 关键字就可以判断对象的原始类型,然后再转即可; |
JDK8和9新特性
- JDK < =7
- 常量: 一般使用public Static final 修饰
- 抽象方法: 意义就是增强实现类必须按这个方法声明完成功能
- JDK==8
- 新增了默认方法: 用default修饰(将)
- 冲突: 如果多个接口中存在冲突的方法, 则要求子类直接重写方法
- 新增了静态方法: 通过接口名直接调用, 提升代码的复用性
- 冲突: 静态方法不存在冲突, 因为调用方式不允许通过子类对象调用, 只能通过接口名.方法名调用
- 静态方法用途:
- JDK >= 9
- 新增了私有方法: 仅仅为了提升静态方法和默认方法的代码复用性
- 冲突: 不会出现冲突, 因为用private修饰的方法, 外界根本调用不了


All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.


