Java 8 добавил метод по умолчанию, который может добавить новые функциональные функции в интерфейс, не влияя на класс реализации интерфейса. Давайте проиллюстрируем это с примерами ниже.
Кода -копия выглядит следующим образом:
открытый класс MyClass реализует Interfacea {
public static void main (string [] args) {
}
@Override
public void говорит что -то () {
// TODO Автогенерированный метод заглушка
}
}
Интерфейс интерфейс интерфейс {
public void говорит что -то ();
}
Приведенный выше код показывает, что класс MyClass реализует метод указанного () интерфейса интерфейса. Теперь мы добавляем новый метод Sayhi () в интерфейс интерфейса. Если это сделано, класс MyClass не может быть составлен, если мы не предоставим метод реализации sayhi ().
Метод по умолчанию очень полезен. например:
Кода -копия выглядит следующим образом:
открытый класс MyClass реализует Interfacea {
public static void main (string [] args) {
}
@Override
public void говорит что -то () {
// TODO Автогенерированный метод заглушка
}
}
Интерфейс интерфейс интерфейс {
public void говорит что -то ();
по умолчанию public void sayshi () {
System.out.println ("Привет");
}
}
Обратите внимание, что мы должны предоставить реализации всех методов по умолчанию. Следовательно, метод по умолчанию делает наш код более гибким, а также может написать методы для их реализации в интерфейсе. Реализированный метод будет реализован как метод по умолчанию.
Итак, что мне делать, если в нескольких интерфейсах есть конфликт?
Поскольку классы Java могут реализовать несколько интерфейсов, может возникнуть ситуация, когда два или более интерфейса имеют метод интерфейса по умолчанию с тем же именем, вызывая конфликты. Поскольку виртуальная машина Java работает при запуске программы, неясно, какой метод по умолчанию вы хотите использовать. Это приведет к ошибке компиляции.
Давайте посмотрим на следующий пример.
Кода -копия выглядит следующим образом:
открытый класс MyClass реализует Interfacea, InterfaceB {
public static void main (string [] args) {
Myclass mc = new myclass ();
mc.sayhi ();
}
@Override
public void говорит что -то () {
// TODO Автогенерированный метод заглушка
}
}
Интерфейс интерфейс интерфейс {
public void говорит что -то ();
по умолчанию public void sayshi () {
System.out.println ("Привет из интерфейса");
}
}
интерфейс интерфейс interfaceb {
по умолчанию public void sayshi () {
System.out.println ("Привет из интерфейса");
}
}
Он не может пройти компиляцию и сообщить о следующей ошибке:
«Дублирующие методы по умолчанию с именем Sayhi с параметрами () и () унаследованы от типов интерфейса и интерфейса».
Если метод sayhi () не переопределен в классе MyClass:
Кода -копия выглядит следующим образом:
открытый класс MyClass реализует Interfacea, InterfaceB {
public static void main (string [] args) {
Myclass mc = new myclass ();
mc.sayhi ();
}
@Override
public void говорит что -то () {
// TODO Автогенерированный метод заглушка
}
@Override
public void sayshi () {
System.out.println («Реализация sayhi () в myclass»);
}
}
Интерфейс интерфейс интерфейс {
public void говорит что -то ();
по умолчанию public void sayshi () {
System.out.println ("Привет из интерфейса");
}
}
интерфейс интерфейс interfaceb {
по умолчанию public void sayshi () {
System.out.println ("Привет из интерфейса");
}
}
Если вы хотите указать, какой метод sayhi () интерфейса () вызову, мы можем сделать это:
Кода -копия выглядит следующим образом:
открытый класс MyClass реализует Interfacea, InterfaceB {
public static void main (string [] args) {
Myclass mc = new myclass ();
mc.sayhi ();
}
@Override
public void говорит что -то () {
// TODO Автогенерированный метод заглушка
}
@Override
public void sayshi () {
Interfacea.super.sayhi ();
}
}
Интерфейс интерфейс интерфейс {
public void говорит что -то ();
по умолчанию public void sayshi () {
System.out.println ("Привет из интерфейса");
}
}
интерфейс интерфейс interfaceb {
по умолчанию public void sayshi () {
System.out.println ("Привет из интерфейса");
}
}
Ответ очень прост?