接口定义增强

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、接口的使用还应该以抽象方法为主。