Я изучал интерфейсы, когда заметил, что теперь вы можете определять статические методы и методы по умолчанию в интерфейсе.
public interface interfacesample2 {
public static void method() {
System.out.println("hello world");
}
public default void menthod3() {
System.out.println("default print");
}
}
Пожалуйста, объясните разницу между ними, а также, если есть пример, когда мы будем использовать это, было бы неплохо. Немного запутался в интерфейсах.
default implementation
это метод, который может быть переопределен.Ответы:
Различия между статическими методами и методами по умолчанию в Java 8:
1) Методы по умолчанию могут быть переопределены при реализации класса, а статические - нет .
2) Статический метод принадлежит только классу интерфейса, поэтому вы можете вызывать только статический метод в классе интерфейса, а не в классе, реализующем этот интерфейс, см.:
3) И класс, и интерфейс могут иметь статические методы с одинаковыми именами, и ни один из них не переопределяет другие!
источник
purpose
( используйте общую реализацию ) и разрешают неоднозначностьimplementing the logic again in subclass
( переопределение, скрытие ). единственная разумная причина может быть связана с тем, что [методы статического интерфейса не наследуются] ( stackoverflow.com/questions/25169175/… ) и, следовательно, мы не можем вызывать их, используя экземпляр подкласса.Статический метод - это метод, который, так сказать, применяется к «пространству имен» класса. Таким образом, доступ к
static
методуfoo
интерфейсаInterface
осуществляется черезInterface.foo()
. Обратите внимание, что вызов функции не применяется к какому-либо конкретному экземпляру интерфейса.С
bar
другой стороны, реализация по умолчанию вызываетсяstatic
Метод интерфейса не может знать оthis
переменной, но реализация по умолчанию может.источник
Статические методы интерфейса похожи на методы статического класса (здесь они относятся только к интерфейсу). Если методы интерфейса по умолчанию предоставляют методы
default implementation
интерфейса (которые могут реализовывать классыoverride
).Но помните, что если класс является
implementing more than one interface with same default
сигнатурой метода, то класс реализацииneeds to override the default method
Ниже вы можете найти простой пример (можно DIY для разных случаев)
Это зависит от постановки вашей проблемы. Я бы сказал, что методы по умолчанию полезны, если вам нужна такая же реализация для метода в вашей спецификации во всех классах в этом контракте, или он может использоваться как
Adapter
классы.вот хорошее чтение: /software/233053/why-were-default-and-static-methods-added-to-interfaces-in-java-8-when-we-alread
также ниже документ оракула объясняет стандартные и статические методы для развития существующих интерфейсов:
http://docs.oracle.com/javase/tutorial/java/IandI/nogrow.html
источник
Вот мой взгляд:
статический метод в интерфейсе:
Вы можете вызвать его напрямую (InterfacetA.staticMethod ())
Подкласс не сможет переопределить.
Подкласс может иметь метод с тем же именем, что и staticMethod
метод по умолчанию в интерфейсе:
Вы не можете назвать это напрямую.
Подкласс сможет отменить это
Преимущество:
статический метод: вам не нужно создавать отдельный класс для служебного метода.
Метод по умолчанию: Обеспечивает общие функции в методе по умолчанию.
источник
Эта ссылка содержит некоторые полезные сведения, некоторые из них перечислены здесь.
стандартные и статические методы сократили различия между интерфейсами и абстрактными классами.
Методы интерфейса по умолчанию :
Статические методы интерфейса :
Хотел бы процитировать еще одну полезную ссылку .
источник
Методы интерфейса по умолчанию:
Это помогает избежать использования служебных классов, например, все методы класса Collections могут быть предоставлены в самих интерфейсах.
Это помогает в расширении интерфейсов, не боясь сломать классы реализации.
Статические методы интерфейса:
Они являются частью интерфейса, мы не можем использовать его для объектов класса реализации.
Это помогает в обеспечении безопасности, не позволяя классам реализации переопределять их.
Теперь о статическом методе обеспечения безопасности. Посмотрим на пример.
Здесь
obj.newMethod();
печать логики реализации класса означает, что мы можем изменить логику этого метода внутри класса реализации.Но
obj.anotherNewMethod();
печать логики реализации класса, а не измененная реализация интерфейса. Поэтому, если какая-либо логика шифрования-дешифрования написана внутри этого метода, вы не можете изменить ее.источник
Согласно Oracle Javadocs: http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
Обычно статический метод в интерфейсе используется как вспомогательные методы, в то время как метод по умолчанию используется как реализация по умолчанию для классов, реализующих этот интерфейс.
Пример:
источник
Согласно документу Java14 JLS:
Метод по умолчанию:
Это метод экземпляра, объявленный в интерфейсе с модификатором по умолчанию.
Доступ к нему может получить только экземпляр реализующего класса.
Его тело всегда представлено блоком, который обеспечивает реализацию или поведение по умолчанию для любого реализующего класса без переопределения метода.
Это никогда не может быть статичным или приватным
Статический метод:
Его можно вызывать через интерфейс без ссылки на конкретный объект, как и статические методы класса.
Статический метод может быть приватным
Реализующий класс не может получить доступ к статическому методу
Давайте разберемся с этим с помощью приведенного ниже примера кода:
источник
мы не можем выполнить,
Interfacesample2.menthod3();
потому что это не статический метод. Для выполненияmethod3()
нам нужен экземплярInterfacesample2
интерфейса.Пожалуйста, найдите следующий практический пример:
источник
Запуск интерфейса Java 8 также может иметь статический метод. Как и статический метод класса, статический метод интерфейса может быть вызван с использованием имени интерфейса.
пример
Разница между статическим методом интерфейса и методом по умолчанию заключается в том, что метод по умолчанию поддерживает наследование, а статический метод - нет. Метод по умолчанию можно переопределить при наследовании интерфейса.
Здесь можно прочитать о методе интерфейса по умолчанию и статическом методе. Метод интерфейса по умолчанию в Java 8
источник
Все хорошие ответы здесь. Я хотел бы добавить еще одно практическое использование статической функции в интерфейсе. Совет взят из книги Джошуа Блоха «Эффективная Java, 3-е издание» в главе 2: Создание и уничтожение объекта.
Статический фабричный метод - это методы, возвращающие объект. Они работают как конструктор. В определенных случаях статический фабричный метод предоставляет более читаемый код, чем использование конструктора.
Цитата из книги - Эффективная Java, 3-е издание, Джошуа Блох
Автор приводит пример Коллекций, в которых реализован такой статический фабричный метод. Проверяя код, можно увидеть Джоша Блоха как первого автора класса Collections. Хотя Коллекции - это класс, а не интерфейс. Но концепция все еще актуальна.
Далее он объясняет, что API не только меньше, он помогает с читабельностью кода и легкостью API.
Вот один из статических методов из класса java.util.Collections:
источник