菜鸡的Java笔记 第三十五 接口定义增强

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

猜你喜欢

转载自www.cnblogs.com/mysterious-killer/p/10123594.html