Java 8中的改进的接口

2017-07-29  本文已影响0人  linweiyu21

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 方法与 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?

上一篇 下一篇

猜你喜欢

热点阅读