До Java 8 все методы интерфейса Interface были
抽象方法
и常量
, а в Java8, что нового в интерфейсе?
статический элемент
До 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
静态成员
, член по умолчанию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);
}
}
функция по умолчанию
До Java8 функции интерфейса не могли быть реализованы следующим образом:
public interface MyInterface {
int MAX_SERVICE_TIME = 100;
void test();
}
В Java8 есть реализация функций поддержки в интерфейсе, если функции предшествует
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
Все методы в .
статическая функция
Разрешить определение интерфейса в Java8
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() {
return new MyClass();
}
}
Аннотация @FunctionalInterface
- что
函数式接口
?
Функциональный интерфейс на самом деле является интерфейсом, но это особый интерфейс: интерфейс типа SAM (Single Abstract Method). Этот тип интерфейса определен таким образом, что методы, принимающие его в качестве параметров, могут вызываться с
Lambda
выражение в качестве параметра.
@FunctionalInterface
public interface MyInterface {
void test();
}
@FunctionalInterface
Аннотации могут помочь нам определить, является ли интерфейс функциональным интерфейсом, но эта аннотацияЭто не обязательно, и об ошибке не будет сообщено, если он не будет добавлен..
@FunctionalInterface
public interface MyInterface {//报错
void test();
void doSomething();
}
Интерфейс в
非default/static方法都是abstract的
, поэтому приведенный выше интерфейс не является функциональным интерфейсом, добавление @FunctionalInterface подскажет нам, что это не функциональный интерфейс.
- Какова роль функционального интерфейса?
Функциональный интерфейс можно вызвать с помощью лямбда-выражения в качестве параметра.
Поэтому следующей особенностью Java8 является лямбда-выражение, пожалуйста, смотрите подробное объяснение в следующий раз.