Java 8 вводит новую функцию «Метод по умолчанию» или (Защитник), которая позволяет разработчику добавлять новые методы к интерфейсам без нарушения существующей реализации этого интерфейса. Он обеспечивает гибкость, позволяющую интерфейс определять реализацию, которая будет использоваться по умолчанию в ситуации, когда конкретный класс не может обеспечить реализацию для этого метода.
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
Существует один общий вопрос, что люди спрашивают о методах по умолчанию, когда они слышат о новой функции в первый раз:
Что делать, если класс реализует два интерфейса, и оба эти интерфейсы определяют по умолчанию метод с той же подписью?
Пример для иллюстрации этой ситуации:
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public interface B {
default void foo(){
System.out.println("Calling B.foo()");
}
}
public class ClassAB implements A, B {
}
Этот код не компилировать со следующим результатом:
java: class Clazz inherits unrelated defaults for foo() from types A and B
Чтобы исправить это, в Clazz, мы должны решить его вручную переопределение противоречивого метода:
public class Clazz implements A, B {
public void foo(){}
}
Но что, если мы хотим назвать стандартную реализацию метода foo() из интерфейса A вместо того, чтобы внедрять наши собственные.
Можно сослаться на # Foo() следующим образом:
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}
см это сообщение о умолчанию http://zeroturnaround.com/rebellabs/java-8-explained-default-methods/ #!/ – emeraldjava
Связанное сообщение https://stackoverflow.com/questions/31578427/what-is-the-purpose-of-the-default-keyword-in-java – Ravi