Каково назначение ключевого слова по умолчанию в Java?
интерфейс в Java похож на класс, но тело
интерфейс может включать только абстрактные методы иfinalполя
(константы.)
недавно, я увидел вопрос, который выглядит так
interface AnInterface {
public default void myMethod() {
System.out.println("D");
}
}
согласно определению интерфейса,только абстрактные методы разрешено. Почему это позволяет мне компилировать приведенный выше код? Что такое default ключевое слово?
С другой стороны, когда я пытался написать ниже код, то он говорит modifier default not allowed here
default class MyClass{
}
вместо
class MyClass {
}
может кто-нибудь сказать мне цель default ключевое слово? Это разрешено только внутри интерфейса? Чем он отличается от default (модификатор доступа)?
7 ответов:
это новая функция в Java 8, которая позволяет
interfaceдля обеспечения реализации. Описано в Java 8 JLS-13.5.6. Объявления Методов Интерфейса который читает (частично)добавлять
defaultметод, или изменение метода отabstractдоdefault, не нарушает совместимость с уже существующими двоичными файлами, но может привести кIncompatibleClassChangeErrorесли уже существующий двоичный файл пытается вызвать метод. Эта ошибка возникает, если тип квалификации,Tэто подтип двух интерфейсов,IиJ, гдеIиJобъявленияdefaultметод с той же сигнатурой и результат, а неI, ниJявляется подинтерфейсом другого.что нового в JDK 8 говорит (частично)
методы по умолчанию позволяют добавлять новые функциональные возможности в интерфейсы библиотек и обеспечивают двоичную совместимость с кодом, написанным для более старых версий этих библиотек межфазные границы.
методы по умолчанию были добавлены в Java 8 в основном для поддержки лямбда-выражений. Дизайнеры (умно, на мой взгляд) решили сделать синтаксис lambdas для создания анонимных реализаций интерфейса. Но учитывая, что лямбды могут реализовать только один метод, они будут ограничены интерфейсами с одним методом, что будет довольно серьезным ограничением. Вместо этого были добавлены методы по умолчанию, позволяющие использовать более сложные интерфейсы.
Если вам нужно некоторое убеждение утверждают, что
defaultбыл введен из-за лямбды, обратите внимание, что соломы много предложение проекта лямбда, Марк Рейнхольд, в 2009 году, упоминает "методы расширения" в качестве обязательной функции, которая будет добавлена для поддержки лямбд.вот пример, демонстрирующий концепт:
interface Operator { int operate(int n); default int inverse(int n) { return -operate(n); } } public int applyInverse(int n, Operator operator) { return operator.inverse(n); } applyInverse(3, n -> n * n + 7);очень надуманный, я понимаю, но должна показать, как
defaultподдерживает лямбда-выражения. Потому чтоinverseпо умолчанию он может быть легко переопределен реализующим классом, если требуемый.
в Java 8 введено новое понятие, называемое методами по умолчанию. Методы по умолчанию - это те методы, которые имеют некоторую реализацию по умолчанию и помогают в развитии интерфейсов без нарушения существующего кода. Давайте посмотрим на пример:
public interface SimpleInterface { public void doSomeWork(); //A default method in the interface created using "default" keyword default public void doSomeOtherWork(){ System.out.println("DoSomeOtherWork implementation in the interface"); } } class SimpleInterfaceImpl implements SimpleInterface{ @Override public void doSomeWork() { System.out.println("Do Some Work implementation in the class"); } /* * Not required to override to provide an implementation * for doSomeOtherWork. */ public static void main(String[] args) { SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl(); simpObj.doSomeWork(); simpObj.doSomeOtherWork(); } }и вывод:
сделать некоторые работы реализации в классе
Реализация DoSomeOtherWork в интерфейсе
то, что было упущено из виду в приведенных выше ответах, было его ролью в аннотациях. Еще в Java 1.5,
defaultключевое слово появилось как средство для указать значение по умолчанию для поля аннотация.@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Processor { String value() default "AMD"; }Это был перегружен С введением Java 8, чтобы позволить определить метод по умолчанию в интерфейсах.
что-то еще, что было упущено из виду: причина, по которой декларация
default class MyClass {}является недопустимым из-за так что классы объявляются вообще. В языке нет положения, которое позволяет этому ключевому слову появляться там. Это тут появляются для объявления метода интерфейса, хотя.
новая Java 8 функция (Методы По Умолчанию) позволяет интерфейсу обеспечить реализацию, когда он помечен
defaultключевое слово.Например:
interface Test { default double getAvg(int avg) { return avg; } } class Tester implements Test{ //compiles just fine }тест интерфейса использует ключевое слово по умолчанию, которое позволяет интерфейсу обеспечить реализацию метода по умолчанию без необходимости реализации этих методов в классах, использующих интерфейс.
назад совместимость: Представьте, что ваш интерфейс реализован сотнями классов, изменение этого интерфейса заставит всех пользователей реализовать недавно добавленный метод, даже если он не является существенным для многих других классов, реализующих ваш интерфейс.
Факты И Ограничения:
1-может быть установлено только в интерфейсе, а не в классе или абстрактный класс.
2-должен обеспечить тело
3-это не предполагается быть общедоступным или абстрактным, как и другие обычные методы, используемые в интерфейсе.
методы по умолчанию позволяют добавлять новые функции в интерфейсы ваших приложений. Он также может быть использован, чтобы иметь мульти наследство. В дополнение к методам по умолчанию можно определить статические методы в интерфейсах. Это делает его легче для вас, чтобы организовать вспомогательные методы
очень хорошее объяснение находится в Учебники Java™, часть объяснения заключается в следующем:
Рассмотрим пример, в котором участвуют производители автомобилей с компьютерным управлением, которые публикуют стандартные отраслевые интерфейсы, описывающие, какие методы могут быть вызваны для управления их автомобилями. Что, если эти производители автомобилей с компьютерным управлением добавят новые функции, такие как полет, в свои автомобили? Эти производители должны будут указать новые методы для включения других компании (например, производители электронных приборов наведения) адаптируют свое программное обеспечение к летающим автомобилям. Где бы эти производители автомобилей объявили эти новые методы, связанные с полетами? Если они добавят их к своим исходным интерфейсам, то программисты, которые реализовали эти интерфейсы, должны будут переписать свои реализации. Если они добавляют их как статические методы, то программисты будут рассматривать их как полезные методы, а не как существенные, основные методы.
методы по умолчанию позволяют вам чтобы добавить новые функциональные возможности в интерфейсы библиотек и обеспечить двоичную совместимость с кодом, написанным для более старых версий этих интерфейсов.
Comments