接口定义增强
在 java 从一开始到现在接口之中的核心组成部分: 抽象方法与全局常量, 但是随着技术的不断发展, 用户在使用过程之中发现了有一些问题
如果说现在有一个接口经过了长年的使用, 这个接口已经有了 10W 个子类了, 突然有一天你的老板说, 接口里增加一个抽象方法
并且要求这些接口子类的方法都一样, 如果不同, 一个个实现, 如果相同呢? 实现到死
那么为了解决这样的问题, 从 JDK1.8 开始为接口里面追加了两种方法的定义: default 定义普通方法, static 定义静态方法
但是需要知道一点, 即使接口之中提供有普通方法, 这个接口也不能够直接实例化, 还是依靠子类完成
范例: 在接口中定义普通方法
- package cn.mysterious;
- interface iMessage{
- public String getMsg();
- public default void print(){// 必须使用 default
- System.out.println(this,getMsg());
- }
- }
- class MessageImpl implements iMessage{
- @Override
- public String getMsg() {
- // TODO Auto-generated method stub
- return "hello world";
- }
- }
- public class StudyLang {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- iMessage msg = new MessageImpl();
- msg.print();
- }
- }
如果你在整个设计执行之前中间追加了抽象类的话, 这样的尴尬局面就不会有了
除了 default 之外, 也可以使用 static 定义静态方法, 而静态方法的特点就是可以直接由类名称负责调用
范例: 使用 static 定义静态方法
- package cn.mysterious;
- interface iMessage{
- public String getMsg();
- public default void print(){ // 必须使用 default
- System.out.println(this,getMsg());
- }
- public static iMessage getInstance() {
- return new iMessage() { // 匿名内部类
- public String getMsg() {
- return null;
- }
- };
- }
- }
- class MessageImpl implements iMessage{
- @Override
- public String getMsg() {
- // TODO Auto-generated method stub
- return "hello world";
- }
- }
- public class StudyLang {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- iMessage msg = iMessage.getInstance();
- msg.print();
- }
- }
使用 static 定义的方法可以由接口名称直接调用
来源: http://www.bubuko.com/infodetail-2899929.html