1.问题引出
众所周知,接口由全局变量和抽象方法组成,如果现在有个接口,有2W个子类,如果有一天发现,这个接口中方法不足,要增加一个方法,而针对于所有不同的子类,这个方法的功能实现是完全一样的。
最初的设想:在每一个子类上都覆写这个新的方法,那么就要覆写两万个子类,时间复杂度O(n),为了解决这个问题,JDK1.8以后允许在接口里面定义普通方法,但是如果要定义普通方法,就要明确的使用default来进行定义。
package TestDemo;
interface IMessage{
public void print();
default void fun(){//在接口里面定义了一个普通的方法
System.out.println("JDK1.8new character");
}
}
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();//调用了接口中default关键字定义的fun方法
}
}
结果:
除了使用default定义方法之外,还可以使用static定义方法,一旦使用了static关键字定义,就说明此方法只可以使用类名称调用
package TestDemo;
interface IMessage{
public void print();
default void fun(){//在接口里面定义了一个普通的方法
System.out.println("JDK1.8new character");
}
static void get(){
System.out.println("static method in 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();
}
}
总结:(接口增强少用)
1.接口里面使用default或static定义方法的意义是避免子类重复实现同样的代码
2.接口的使用还应该以抽象方法为主