接口定义增强
在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 定义的方法可以由接口名称直接调用