美文网首页
Java 8中的改进的接口

Java 8中的改进的接口

作者: linweiyu21 | 来源:发表于2017-07-29 11:46 被阅读0次

Java 8 允许在接口中定义默认方法.默认方法必须使用 default 修饰,该方法不能使用 static 修饰,无论程序是否指定,默认方法总是使用 public 修饰.如果开发者没有指定 public ,系统会自动为默认方法添加 public 修饰符.由于默认方法并没有 static 修饰,因此不能直接使用接口来调用默认方法,需要使用接口的实现类的实例来调用这些默认方法.

Java 8 允许在接口中定义类方法,类方法必须使用 static 修饰,该方法不能使用 default 修饰,无论程序是否指定,类方法总是使用 public 修饰.如果开发者没有指定 public ,系统会自动为类方法添加 public 修饰符.类方法可以直接使用接口来调用.

接口定义实例

public interface Output {
    int MAX_CACHE_LINE = 50;

    void out();

    void getData(String msg);

    // 在接口中定义默认方法
    default void print(String... msg) {
        Arrays.asList(msg).forEach(m -> System.out.println(m));
    }

    default void print_v2(String... msg) {
        for (String m : msg) {
            System.out.println(m);
        }
    }

    // 在接口中定义静态方法
    static String staticTest() {
        return "接口里的静态方法";
    }

    static String staticTest_v2() {
        return "接口里的静态方法_v2";
    }
}
public class OutputImpl implements Output {

    @Override
    public void out() {
        System.out.println("out invoke");
    }

    @Override
    public void getData(String msg) {
        System.out.println("getData invoke");
    }
}

使用实例

        Output output = new OutputImpl();
        // 常规接口方法调用
        output.out();
        output.getData("hello");

        // default方法调用
        output.print("hello", "indian mi fan", "are you ok?");
        output.print_v2("thank", "you");

        // static方法调用
        System.out.println(Output.staticTest());
        System.out.println(Output.staticTest_v2());
        // 不能通过接口的实现类直接调用接口的static方法OutputImpl.staticTest();

总结

  • 接口的 default(默认) 方法可以提供方法实现体
  • 接口的实现类可以不实现 default(默认) 方法
  • 接口的实现类可以实现 default(默认) 方法
  • 接口的实现类的实例可以直接使用 default(默认) 方法
  • 接口的 static(静态) 方法只能被接口直接调用.不能被接口的实现类调用
  • 接口的 default(默认) 方法与 static(静态) 方法都可以定义多个

接口的 default 方法与 static 方法都不可以使用 final 进行修饰

static 方法不能使用 final 修饰这个很容易理解, staitc 方法是属于接口的方法,不会被实现类重写.
default 方法不能被 final 修饰,个人的理解是 default 方法本质上是一个"有实现体"的接口抽象方法,为所有实现类提供一个默认的实现,而这个 default 方法和其他抽象方法一样,被设计出来就希望是被实现类进行重写的.
假设 default 方法可以被 final 修饰,则这个方法就不能被接口的所有实现类重写,也就是说这个方法只能有一种实现,那不就和 static 方法一样了吗?那直接将这个方法设计为 static 方法就好了.
注:重写( override )是在继承与多态的概念下才有的.
而 static 修饰的对象则属于类本身,与继承多态并无关联.

参考

《疯狂Java讲义》
Why is “final” not allowed in Java 8 interface methods?

相关文章

  • Java 8中的改进的接口

    Java 8 允许在接口中定义默认方法.默认方法必须使用 default 修饰,该方法不能使用 static 修饰...

  • Java 8全面解析

    改进接口 现在可以在接口中定义静态方法了。例如,java.util.Comparator接口中现在拥有一个静态的n...

  • 简单工厂

    1.面向接口编程 2.简单工厂模式实例 使用java反射改进:

  • 面试

    1. 接口设计规范 2. 微服务接口最重要的是什么? 3. Java8数据结构有什么改进? 4. steam流相比...

  • [Android每日精彩]Java8新特性

    函数式接口 默认方法 解开lambda最强作用的神秘面纱 类型注解 重复注解 Java8的泛型类型推断改进 深入解...

  • 听,有风声

    Java研发工程师 岗位职责:1、参与系统架构设计、接口规范制定、技术文档编写等;2、改进现有模块功能,提高系统的...

  • Java 8对接口做的两个改进

    Java 8对接口做了两个改进: 一个是Default Method(默认方法), 另一个是Functional ...

  • Eclipseji编辑器——创建java接口

    打开新建 Java 接口向导 新建 Java 接口向导可以创建新的 Java 接口。打开向导的方式有: 点击 Fi...

  • android JNI NDK入门

    1、JNI(Java Native Interface) Java本地接口,又叫Java原生接口。它允许Java调...

  • JNI&NDK

    JNI: Java Native Interface (Java本地接口,本地接口即C和C++开发的接口) → 调...

网友评论

      本文标题:Java 8中的改进的接口

      本文链接:https://www.haomeiwen.com/subject/vwbqlxtx.html