Java8接口中抽象方法和default和static方法的区别和使用

Java接口说明

传统的理解是接口只能是抽象方法。但是程序员们在使用中,发现很不方便,实现接口必须重写所有方法,很麻烦。所以java设计者妥协了,在java8中,支持default和static方法,这样,实现接口时,可以选择不对default修饰的方法重写。

抽象方法

接口当中的抽象方法,修饰符必须是两个固定的关键字:public abstract
这两个关键字修饰符,可以选择性地省略
方法的三要素,可以随意定义。

public interface MyInterfaceAbstract{
//这是一个抽象方法
public abstract void methodAbs1();
//这也是抽象方法
abstract void methodAbs20:
// 这也是抽象方法
public void methodAbs3();
//这也是抽象方法 void methodAbs4();
}

default方法

当一个接口要添加一些新的公共逻辑,写了一个新的方法,那么所有的实现类都需要重写新方法,如果实现类太多,会非常麻烦。
这时可以使用 default。

  1. 接口中的default方法,可以写方法内容。
  2. 接口中的default方法不强制实现类重写,不会影响到已有的实现类。
  3. 接口的实现类,可以调用接口中的default方法。

static方法

  1. 接口中的static方法,可以写方法内容。
  2. 接口中的static方法不允许实现类重写(如果重写方法加上@Override会报错),不会影响到已有的实现类。
  3. 接口中的static方法,可以直接通过接口名称调用。

示例

  • OrderService接口
public interface OrderService {
    /**
     * 接口中的变量都是 默认 public static final的,可以不用写这些修饰符
     */
    String NAME = "static";

    /**
     * static方法,可以直接通过接口名称调用 static方法。
     * 比如 OrderService.selectName();
     *
     */
    static String selectStatic() {
        return NAME;
    }

    /**
     * default方法,可以写方法内容,实现类不强制重写 default方法。
     *
     */
    default String selectDefault() {
        return "default";
    }
    String selectOrder();
}
  • 接口实现类
public class OrderServiceImpl implements OrderService {
    @Override
    public String selectOrder() {
        return "order";
    }
}
  • 测试
public class InterfaceTest {
    public static void main(String[] args) {
        OrderServiceImpl orderServiceImpl = new OrderServiceImpl();
        //接口的实现类,可以调用接口中的default方法
        String user = orderServiceImpl.selectDefault();
        System.out.println("selectDefault()结果为:"+user);

        //static方法,可以直接通过接口名称调用,无需实例化
        String name = OrderService.selectStatic();
        System.out.println("OrderService.selectStatic()结果为:"+ name);
    }
}
posted @ 2022-11-29 21:41  一锤子技术员  阅读(11)  评论(0编辑  收藏  举报  来源