Java新特性接口的加强

接口的加强

JDK1.8之前的接口定义:

  • 接口就是抽象方法和去全局常量的集合;
  • 接口中定义的方法是抽象方法,默认是public abstract修饰;
  • 在接口中定义的变量,其实是一个常量,并且是public static final修饰。

如果现在有一个需要,需要在接口中增加一个新的功能,而它的子类有3W个,那么就要重复粘贴3W次。
造成该问题的原因是:因为接口只是一个方法的声明,而没有具体的实现,所以随着时间的推移,接口就无法使用

为了解决以上的问题,专门提供了两类新的结构。
JDK1.8之后的接口定义:

  • 使用default来定义普通方法,需要通过对象调用;
  • 使用static来定义静态方法,通过接口名就可以调用。

举例:定义普通方法

public interface Message {
    void print();
    /**
     * 如果增加一个greeting方法,那么子类都要实现它,否则都会报错,
     * 如果子类数量相当多,那么实现起来很困难,因此引入了默认方法。
     */
    //追加了普通方法,必须有方法体
    default void greeting(){
        System.out.println("default greeting!");
    }

}

public class QQMessage implements Message{
    @Override
    public void print() {
        System.out.println("print QQMessage!");
    }
}

public class WeiXinMessage implements Message{
    @Override
    public void print() {
        System.out.println("print WeiXinMessage!");
    }
}

public class TestMessage {
    public static void main(String[] args) {
        //此处也可以写成QQMessage的对象调用greeting方法,
        //类似继承,它是一个普通方法,将它继承下来。
        Message qq = new QQMessage();
        qq.print();
        qq.greeting();
    }
}

如果对父类的方法不满意,子类也可以根据实际情况进行覆写。那么父类对象调用的就是子类覆写的普通方法。
举例:定义static方法

public interface Message {
    void print();
    
    default void greeting(){
        System.out.println("default greeting!");
    }

    //可以直接通过接口名称调用 Message.messageInfo()
    static void messageInfo(){
        System.out.println("static 方法");
    }
}

整体来讲,接口感觉更像抽象类了,但是比抽象类更强大的在于:接口的子类可以继承多个父接口,而抽象类是能实现单继承

猜你喜欢

转载自blog.csdn.net/mi_zhi_lu/article/details/91359147
今日推荐