JAVA8新特性——Interface相关

概述

interface 的设计初衷是面向抽象,提高扩展性。这也留有一点遗憾,Interface 修改的时候,实现它的类也必须跟着改。

为了解决接口的修改与现有的实现不兼容的问题。新 interface 的方法可以用defaultstatic 修饰,这样就可以有方法体,实现类也不必重写此方法。

  1. default修饰的方法,是普通实例方法,可以用this调用,可以被子类继承、重写。
  2. static修饰的方法,使用上和一般类静态方法一样。但它不能被子类继承,只能用Interface调用。

静态成员

在Java8以前,我们要定义一些常量,一般会写一个类,类中都是final static的一些变量,如下:

public class Constants {
    public static final int MAX_SERVICE_TIME = 100;
}

public class Hello {
    public static void main(String[] args) {
        System.out.println(Constants.MAX_SERVICE_TIME);
    }
}

在Java8中Interface支持静态成员,成员默认是public final static的,可以在类外直接调用。

public interface MyInterface {
    int MAX_SERVICE_TIME = 100;
}

public class Hello {
    public static void main(String[] args) {
        System.out.println(MyInterface.MAX_SERVICE_TIME);
    }
}

default函数

在Java8以前,Interface中的函数是不能实现的,如下:

public interface MyInterface {
    int MAX_SERVICE_TIME = 100;
    void test();
}

在Java8中,Interface中支持函数有实现,只要在函数前加上default关键字即可,如下:

public interface MyInterface {
    int MAX_SERVICE_TIME = 100;

    void test();
    
    default void doSomething() {
        System.out.println("do something");
    }
}

default函数,实现类可以不实现这个方法,如果不想子类去实现的一些方法,可以写成default函数。Java8之前,如果我们想实现这样的功能,也是有办法的,那就是先定义Interface,然后定义Abstract Class实现Interface,然后再定义Class继承Abstract Class,这样Class就不用实现Interface中的全部方法。

在接口中,增加default方法,是为了既有的成千上万的Java类库的类增加新的功能,且不必对这些类进行重新设计。因此它既被称为默认方法,又被称为拓展方法

比如说,只需要在Collection接口中增加default Stream stream(),相应的SetList接口以及它们的子类都会包含此方法,不必再去为每个子类重新copy这个方法。

static函数

在Java8中允许Interface定义static方法,这允许API设计者在接口中定义像getInstance一样的静态工具方法,这样就能够使得API简洁而精练,如下:

public interface MyInterface {
    default void doSomething() {
        System.out.println("do something");
    }
}

public class MyClass implements MyInterface {

}

public interface MyClassFactory {
    public static MyClass getInstance() { //用法和普通的static方法一样
        return new MyClass();
    }
}

可以通过调用 MyClassFactory.getInstance() 来获取一个 MyClass 实例,而无需直接调用 new MyClass() 来创建对象。这种方式可以将对象的创建逻辑集中在工厂方法中,使得代码更具可维护性和可扩展性。同时,接口中的默认方法允许在接口演化过程中向接口添加新的方法,而不会影响已有的实现类。

实现接口的类或者子接口不会继承接口中的静态方法。

接口和抽象类的异同?

相同点

  • 都是抽象类型
  • 都可以有实现方法
  • 都可以不需要实现类或继承者实现所有方法

不同点

  • 接口多实现,类单继承
  • 接口不能具有构造方法,因为接口不能被实例化;抽象类可以有构造方法,可以用于初始化抽象类的状态或传递参数给子类的构造方法
  • 接口的方法是 public abstract 修饰,变量是 public static final 修饰。 抽象类可以用其他修饰符

记住接口永远和类不一样。

interface 的方法是更像是一个扩展插件。而 abstract class 的方法是要继承的。

posted @ 2023-09-12 22:27  岸南  阅读(110)  评论(0)    收藏  举报