接口定义增强
1、本次预计讲解的知识点
使用default与static定义接口方法。
2、具体内容
从java发展之初到今天已经20年,在这20年的时间里面所有的开发者都知道java接口由全局常量和抽象方法所组成,但是JDK1.8的时代这一组成改变了。
如果说现在有某一个接口,这个接口随着时间的发展已经产生了2w个子类,突然的发现这个接口里面方法不足,应该在增加一个方法,而针对所有不同子类,这个方法的功能实现是完全不一样的。按照最初的做法,应该在每一个子类上都覆写这个新的方法。那么就要修改2w个子类。
所以为了解决这个问题,允许在接口里面定义普通方法了。但是如果要定义普通方法就必须明确的使用default来进行定义。
package cn.mldn.demo; interface IMessage { public void print();//这是一个接口里面原本定义的方法 default void fun(){//在接口里面定义了一个普通方法。 System.out.println("毁三观的方法出现了"); } } class MessageImpl implements IMessage{ @Override public void print(){ System.out.println("Hello World"); } } | public class TestDemo{ public static void main(String[] args){ IMessage msg = new MessageImpl(); msg.fun();//此方法在接口里面直接定义的。 } }
E:\java>javac -d . TestDemo.java
E:\java>java cn.mldn.demo.TestDemo 毁三观的方法出现了 |
除了使用default方法外,还可使用static定义的方法,一旦使用了static定义方法意味着这个方法可以直接由类名称调用。
范例:定义static方法。
package cn.mldn.demo;
interface IMessage {
public void print();//这是一个接口里面原本定义的方法
default void fun(){//在接口里面定义了一个普通方法。
System.out.println("毁三观的方法出现了");
}
static void get(){
System.out.println("interface");
}
}
class MessageImpl implements IMessage{
@Override
public void print(){
System.out.println("Hello World");
}
}
public class TestDemo{
public static void main(String[] args){
IMessage msg = new MessageImpl();
msg.fun();//此方法在接口里面直接定义的。
IMessage.get();
}
}
E:\java>java cn.mldn.demo.TestDemo
毁三观的方法出现了
interface
在JDK1.8里面由一个重要的概念:内部类访问方法参数的时候可以不加上final关键字。所有出现的这些新特性,完全打破了java已有的代码组成形式。
3、总结
1、接口里面使用default或static定义方法的意义是避免子类重复实现同样的代码
2、接口的使用还应该以抽象方法为主。