До 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 является лямбда-выражение, пожалуйста, смотрите подробное объяснение в следующий раз.