Почему в интерфейсах нет статических методов, но есть статические поля и внутренние классы? [pre-Java8]

Здесь было задано несколько вопросов о том, почему вы не можете определять статические методы в интерфейсах, но ни один из них не решает основную несогласованность: почему вы можете определять статические поля и статические внутренние типы в интерфейсе, но не статические методы?

Статические внутренние типы, возможно, не являются справедливым сравнением, поскольку это всего лишь синтаксический сахар, который генерирует новый класс, но почему поля, а не методы?

Аргументом против статических методов в интерфейсах является то, что они нарушают стратегию разрешения виртуальных таблиц, используемую JVM, но разве это не должно применяться в равной степени к статическим полям, то есть компилятор может просто встроить его?

Я желаю согласованности, и Java должна либо не поддерживать статику любой формы в интерфейсе, либо быть согласованной и допускать их.


person skaffman    schedule 24.09.2008    source источник
comment
Поля определены, пока метод не имеет тела. Попытка вызвать метод вызовет ошибку, в то время как переменные будут присутствовать всегда: по умолчанию или определенные.   -  person    schedule 22.03.2012
comment
bugs.sun.com/view_bug.do?bug_id=4093687 - завещание закрыто not fix с 200+ голосами, и это был 1997 год ...   -  person bestsss    schedule 24.07.2012
comment
@erickson - почему вы говорите, что это ответ на собеседование?   -  person Erran Morad    schedule 07.05.2014
comment
@BoratSagdiyev Я не знаю; это был ответ на комментарий, который сейчас был удален.   -  person erickson    schedule 08.05.2014


Ответы (15)


Было сделано официальное предложение, чтобы разрешить статические методы в интерфейсах в Java 7. . Это предложение сделано в рамках Project Coin.

Лично я считаю, что это отличная идея. Технических сложностей в реализации нет, и это очень логично и разумно. В Project Coin есть несколько предложений, которые, я надеюсь, никогда не станут частью языка Java, но это то, что могло бы очистить многие API. Например, Collections класс имеет статические методы для управления любой List реализацией; они могут быть включены в List интерфейс.


Обновление: в подкасте Java Posse № 234, Джо Д. Арси кратко упомянул предложение, сказав, что оно «сложное» и, вероятно, не войдет в проект Coin.


Обновление. Хотя они не вошли в Project Coin для Java 7, Java 8 поддерживает статические функции в интерфейсах.

person erickson    schedule 14.03.2009
comment
Похоже, что статические методы в интерфейсах входят в состав Java 8. - person Bas Leijdekkers; 13.02.2013
comment
В новой Java 8 java.util.function.Function<T,R> объявлен статический метод identity. так что да, в Java 8 у нас есть статические методы в интерфейсах. - person Earth Engine; 25.07.2013

Я собираюсь поддержать мою любимую теорию с этой, которая заключается в том, что отсутствие последовательности в этом случае является вопросом удобства, а не дизайна или необходимости, поскольку я не слышал убедительных аргументов, что это был любой из этих двух .

Статические поля присутствуют (а) потому, что они присутствовали в JDK 1.0, и в JDK 1.0 было принято много хитрых решений, и (б) статические конечные поля в интерфейсах - это самое близкое к константам то, что в то время было в java.

Статические внутренние классы в интерфейсах были разрешены, потому что это чистый синтаксический сахар - внутренний класс на самом деле не имеет ничего общего с родительским классом.

Так что статические методы не разрешены просто потому, что для этого нет веских причин; последовательность не достаточно убедительна, чтобы изменить статус-кво.

Конечно, это может быть разрешено в будущих версиях JLS, ничего не нарушая.

person skaffman    schedule 25.09.2008
comment
Должен признаться, я до сих пор не понимаю, почему вы находите удивительным, что статические методы не разрешены в интерфейсах. Было бы неплохо, если бы вы объяснили, почему их вообще следует разрешить. Без обид, мне просто любопытно, я не понимаю, почему статические методы должны быть частью интерфейсов ... - person Alexander; 26.09.2008
comment
Просто для единообразия, а не из соображений дизайна. Если вы собираетесь разрешить статику любого вида в интерфейсах, то вам следует разрешить любую статику, а не только определенные типы. - person skaffman; 26.09.2008
comment
Забудем на секунду о синтаксисе. Я думаю, что Sun решила, что им нужен способ определения констант (например, перечислений, флагов) в интерфейсах, и самое близкое, что было в Java в то время, было ‹code› static final ‹/code› поля. Как уже говорилось, это не идеально (не совсем константы, нет симметрии), но ... - person Alexander; 28.09.2008
comment
Статический метод интерфейса был бы отличным местом для вызова java.util.ServiceLoader для получения конкретного экземпляра. Я рассматриваю новый оператор как статический метод класса, к которому он применяется. Посмотрите на его отражающий аналог - метод класса, не требующий экземпляра. - person erickson; 02.10.2008
comment
Согласованность с чем? static в полях можно использовать двумя способами. А) атрибуты класса и Б) константы. Атрибуты класса не допускаются в интерфейсах, поскольку они просто определяют контракт, которому нужно следовать, а не состояние или имплицит. Константы не являются ни состоянием, ни имплицитностью, просто, хорошо константами. Следовательно, непротиворечиво. - person OscarRyz; 01.01.2009
comment
будущие версии JLS, ничего не нарушая, они сильно нарушают отражение - на данный момент никто не ожидает (и не проверяет) наличие статических методов при просмотре объявленных методов интерфейса - поэтому этого не произойдет. Думаю, было официальное РСЕ, надо поискать. - person bestsss; 24.07.2012
comment
@bestsss: Предположим, что тело стандартов Java должно было решить, что объявление статического метода в интерфейсе будет синонимом объявления статического внутреннего класса с каким-то конкретным именем, которое никогда ни для чего не использовалось, и всего в исходном коде, которое выглядело бы как вызов метода интерфейса проверяет, существует ли внутренний класс с подходящим именем. Если интерфейсам уже разрешено иметь статические внутренние классы, не нарушит ли такая функция даже код, основанный на отражении? Было бы особенно удобно, если бы можно было объявить статические методы ... - person supercat; 21.09.2012
comment
... со специальным синтаксисом, чтобы указать, что если foo является переменной типа интерфейса bar, у которой нет метода boz, foo.boz(9) будет искать, содержит ли интерфейс статический класс StaticClassesCA37BF13B5 [случайное шестнадцатеричное число, поэтому я сомневаюсь, что какой-либо класс с этим имя уже существует где-нибудь во вселенной] с помощью метода boz(bar, int). Такая вещь может позволить потребителям интерфейса воспользоваться служебными методами без необходимости предоставления каждой реализации шаблонной реализации. - person supercat; 21.09.2012

Нет смысла объявлять статический метод в интерфейсе. Они не могут быть выполнены обычным вызовом MyInterface.staticMethod (). (РЕДАКТИРОВАТЬ: поскольку это последнее предложение смутило некоторых людей, вызов MyClass.staticMethod () выполняет именно реализацию staticMethod на MyClass, который, если MyClass является интерфейсом, не может существовать!) Если вы вызываете их, указав реализующий класс MyImplementor.staticMethod () тогда вы должны знать фактический класс, поэтому не имеет значения, содержит ли его интерфейс или нет.

Что еще более важно, статические методы никогда не переопределяются, и если вы попытаетесь это сделать:

MyInterface var = new MyImplementingClass();
var.staticMethod();

правила для static говорят, что метод, определенный в объявленном типе var, должен быть выполнен. Поскольку это интерфейс, это невозможно.

Конечно, вы всегда можете удалить ключевое слово static из метода. Все будет нормально работать. Возможно, вам придется подавить некоторые предупреждения, если он вызывается из метода экземпляра.

Чтобы ответить на некоторые из приведенных ниже комментариев, причина, по которой вы не можете выполнить "result = MyInterface.staticMethod ()", заключается в том, что ему придется выполнить версию метода, определенную в MyInterface. Но в MyInterface не может быть версии, потому что это интерфейс. У него нет кода по определению.

person DJClayworth    schedule 24.09.2008
comment
Они не могут быть выполнены обычным вызовом MyInterface.staticMethod (). Почему нет? Я думал, что в этом суть вопроса - почему этого нельзя? - person Dave L.; 25.09.2008
comment
Согласен, разве не в этом суть вопроса? Этот ответ - тавтология - вы не можете этого сделать, потому что это не работает! - person erickson; 01.10.2008
comment
Согласен, хороший ответ, но уже на другой вопрос ;-) - person Guillaume; 11.12.2008
comment
у него нет кода по определению. Думаю, дело в том, что мы бы этого хотели. В статических методах. (docs.google.com/Doc?docid=dfkwr6vq_30dtg2z9d8&hl=ru) - person Brian Duff; 11.08.2010
comment
Они не могут быть выполнены MyInterface.staticMethod (), потому что этот синтаксис всегда вызывает реализацию для указанного класса. Интерфейсы не могут иметь реализации по определению. Я вообразил, что это очевидно, или объяснил бы это. - person DJClayworth; 06.12.2010
comment
Насколько я понимаю, здесь комментаторы говорят, что, по их мнению, Java должна позволять реализацию методов в интерфейсах. Не стесняйтесь писать на своем родном языке. Цель этого ответа - проиллюстрировать, как при определенных фундаментальных проектных решениях (интерфейсы не имеют кода) эта семантика возникает естественным образом. - person DJClayworth; 06.12.2010
comment
@DJClayworth, я не понимаю эту часть, все будет нормально работать. Возможно, вам придется подавить некоторые предупреждения, если он вызывается из метода экземпляра. Я вообще не понимаю сценарий, тем более что я попытался вызвать нестатический интерфейсный метод из метода экземпляра разработчика и не получил никаких предупреждений. Пожалуйста, помогите мне понять. - person batbrat; 25.02.2014
comment
Нет необходимости писать на нашем родном языке. Java предоставила ответ на этот вопрос: нет причин не использовать статические методы в интерфейсах, и теперь они есть в Java 8. - person Dave L.; 30.12.2014

Назначение интерфейсов - определить контракт без предоставления реализации. Следовательно, у вас не может быть статических методов, потому что они должны иметь реализацию уже в интерфейсе, поскольку вы не можете переопределить статические методы. Что касается полей, разрешены только статические final fields, которые, по сути, являются константами (в 1.5+ вы также можете иметь перечисления в интерфейсах). Константы нужны, чтобы помочь определить интерфейс без магических чисел.

Кстати, нет необходимости явно указывать модификаторы static final для полей в интерфейсах, потому что разрешены только статические конечные поля.

person Alexander    schedule 24.09.2008
comment
Во-первых, статические финалы - это не константы, это ответ на собеседование. Во-вторых, ни один из этих ответов не отвечает, почему в интерфейсе могут быть статические поля и внутренние классы, но не методы. - person skaffman; 25.09.2008
comment
Конечно, вы можете изменять значения статических полей final, если используете сложные типы, но вы по-прежнему не можете их переназначить. Конечно, вы можете не думать о том, что они предназначены для использования в качестве замены магических чисел, но это только из-за синтаксиса Java. - person Alexander; 25.09.2008
comment
Прочтите мой ответ еще раз, если вы думаете, что я не ответил, почему статические методы не разрешены. - person Alexander; 25.09.2008
comment
Я не упомянул статические внутренние классы, потому что вы уже отклонили их в своем вопросе. - person Alexander; 25.09.2008
comment
Вопрос спрашивает, почему статические поля и внутренние классы приемлемы в интерфейсах. Это не ответ на этот вопрос. - person Zach Langley; 01.01.2009
comment
Полагаю, все вы, так называемые религиозные фанатики, сейчас ломаете голову своими утверждениями, когда статические методы в интерфейсах - это именно то, что было введено в Java 8? Не говори никогда, пожалуйста! Никогда не делайте абсолютных заявлений и не делайте вид, будто вы знаете все тонкости того, что нужно разработчику или что полезно. Такое дерьмо меня расстраивает. Шутки в сторону! И если вы спросите меня, они должны даже разрешить реализацию методов экземпляра в интерфейсах, чтобы мы все могли начать дерьмо с множественным наследованием ... blog.loxal.net/2013/05/java-8-default-interface.html - person mmm; 17.07.2013
comment
Почему ты говоришь, что статические финалы - не константы, скаффман? Как бы вы указали, что поле является константой? - person Peter vdL; 12.09.2014

Это старая ветка, но это очень важный вопрос для всех. Поскольку я заметил это только сегодня, я пытаюсь объяснить это более четко:

Основная цель интерфейса - предоставить что-то, что невозможно реализовать, поэтому, если они предоставляют

статические методы должны быть разрешены

тогда вы можете вызвать этот метод с помощью interfaceName.staticMethodName (), но это нереализованный метод и ничего не содержит. Так что разрешать статические методы бесполезно. Поэтому они вообще этого не предоставляют.

статические поля разрешены

поскольку поля нереализуемы, под реализуемым я имею в виду, что вы не можете выполнять какие-либо логические операции в поле, вы можете выполнять операции в поле. Таким образом, вы не меняете поведение поля, поэтому они разрешены.

Внутренние классы разрешены

Внутренние классы разрешены, потому что после компиляции создается другой файл класса внутреннего класса, например InterfaceName $ InnerClassName.class, поэтому в основном вы предоставляете реализацию в другом объекте все вместе, но не в интерфейсе. Так что реализация во внутренних классах предусмотрена.

Надеюсь, это поможет.

person Community    schedule 11.04.2013

На самом деле, иногда есть причины, по которым кому-то могут быть полезны статические методы. Их можно использовать как фабричные методы для классов, реализующих интерфейс. Например, по этой причине у нас теперь есть интерфейс Collection и класс Collections в openjdk. Так что, как всегда, есть обходные пути - предоставьте другому классу частный конструктор, который будет служить «пространством имен» для статических методов.

person Community    schedule 28.09.2008
comment
Это не отвечает на вопрос "Почему?" - person dolmen; 01.02.2013

До Java 5 обычное использование статических полей было:

interface HtmlConstants {
    static String OPEN = "<";
    static String SLASH_OPEN = "</";
    static String CLOSE = ">";
    static String SLASH_CLOSE = " />";
    static String HTML = "html";
    static String BODY = "body";
    ...
}

public class HtmlBuilder implements HtmlConstants { // implements ?!?
    public String buildHtml() {
       StringBuffer sb = new StringBuffer();
       sb.append(OPEN).append(HTML).append(CLOSE);
       sb.append(OPEN).append(BODY).append(CLOSE);
       ...
       sb.append(SLASH_OPEN).append(BODY).append(CLOSE);
       sb.append(SLASH_OPEN).append(HTML).append(CLOSE);
       return sb.toString();
    }
}

Это означало, что HtmlBuilder не нужно было квалифицировать каждую константу, поэтому он мог использовать OPEN вместо HtmlConstants.OPEN

Использование такого оборудования в конечном итоге сбивает с толку.

Теперь с Java 5 у нас есть синтаксис import static для достижения того же эффекта:

private final class HtmlConstants {
    ...
    private HtmlConstants() { /* empty */ }
}

import static HtmlConstants.*;
public class HtmlBuilder { // no longer uses implements
    ...
}
person toolkit    schedule 24.09.2008
comment
Я согласен, вы можете объявлять статические поля final в интерфейсе, но вы не должны этого делать ;-) - person Guillaume; 11.12.2008
comment
Гил, я не согласен. Вы должны объявлять константы в интерфейсе, только если они объявлены как допустимые возвращаемые типы или входные данные для контракта, указанного в интерфейсе. Да, объявлять интерфейс только для констант нежелательно, но если константы относятся к контракту, то обязательно сделайте это. - person MetroidFan2002; 11.12.2008
comment
Это не касается вопроса OP о статических методах. - person bradheintz; 11.03.2009

Нет никаких реальных причин для отсутствия статических методов в интерфейсах, за исключением того, что разработчики языка Java не хотели этого. С технической точки зрения имело бы смысл их разрешить. В конце концов, абстрактный класс тоже может их иметь. Я предполагаю, но не тестировал это, что вы можете «вручную создать» байтовый код, когда интерфейс имеет статический метод, и он должен работать без проблем для вызова метода и / или использования интерфейса как обычно.

person Angel O'Sphere    schedule 13.05.2011

Я часто задаюсь вопросом, зачем вообще статические методы? У них есть свое применение, но методы уровня пакета / пространства имен, вероятно, охватывают 80 из того, для чего используются статические методы.

person Vasil    schedule 19.03.2009

На ум приходят две основные причины:

  1. Статические методы в Java не могут быть переопределены подклассами, и для методов это гораздо важнее, чем для статических полей. На практике я никогда даже не хотел переопределять поле в подклассе, но я все время переопределяю методы. Таким образом, наличие статических методов не позволяет классу, реализующему интерфейс, предоставлять свою собственную реализацию этого метода, что в значительной степени сводит на нет цель использования интерфейса.

  2. У интерфейсов не должно быть кода; вот для чего нужны абстрактные классы. Весь смысл интерфейса состоит в том, чтобы позволить вам говорить о возможно не связанных объектах, которые, как оказалось, имеют определенный набор методов. Фактически предоставление реализации этих методов выходит за рамки предполагаемых интерфейсов.

person Eli Courtwright    schedule 24.09.2008
comment
1. Классы могут иметь статические методы, и вы также не можете их переопределить. Они не предназначены для переопределения, это, по сути, просто ограниченные функции. - person skaffman; 24.09.2008
comment
2. Я согласен с тем, что интерфейсы должны иметь код npt, но они уже есть - инициализаторы статических полей могут иметь собственный код и логику. Значит, плотина уже прорвана, я просто хочу последовательности. - person skaffman; 24.09.2008
comment
Что вы имеете в виду, когда говорите, что инициализаторы статических полей могут иметь собственный код и логику? Вы имеете в виду, что они могут вызывать метод, который может быть полностью разрешен статически, для инициализации? Это не код. И статические блоки инициализации не допускаются в интерфейсе. - person cynicalman; 24.09.2008

Статические методы привязаны к классу. В Java интерфейс технически не является классом, это тип, но не класс (следовательно, ключевое слово реализует, а интерфейсы не расширяют Object). Поскольку интерфейсы не являются классами, у них не может быть статических методов, потому что нет реального класса, к которому можно было бы присоединиться.

Вы можете вызвать InterfaceName.class, чтобы получить объект класса, соответствующий интерфейсу, но в классе Class конкретно указано, что он представляет классы и интерфейсы в приложении Java. Однако сам интерфейс не рассматривается как класс, и, следовательно, вы не можете присоединить статический метод.

person MetroidFan2002    schedule 01.10.2008
comment
Интерфейсы делают расширяют Object. - person Angel O'Sphere; 16.05.2011
comment
Нет, они этого не делают. По определению, если интерфейс расширяет Object, это будет класс, потому что только классы могут расширять Object. Все, что реализует интерфейс, по определению расширяет Object, потому что единственное, что может реализовывать интерфейсы, - это классы, а каждый класс в Java неявно расширяет Object. JLS: Хотя каждый класс является расширением класса Object, не существует единого интерфейса, все интерфейсы которого были бы расширениями. (java.sun.com/docs/books/jls/third_edition /html/interfaces.html) - person MetroidFan2002; 19.05.2011
comment
Фиксированная ссылка: docs.oracle .com / javase / specs / jls / se7 / html / jls-9.html # jls-9.1.3. - person dolmen; 01.02.2013
comment
Интерфейсы, безусловно, определяют класс (Тип, как вы их назвали). Основное отличие состоит в том, что они действуют как абстрактные классы, поскольку не могут быть созданы и ничего не расширяют. - person Mark Renouf; 14.03.2017

В интерфейсе могут быть объявлены только статические поля final (подобно методам, которые являются общедоступными, даже если вы не включаете ключевое слово «public», статические поля являются «окончательными» с ключевым словом или без него).

Это всего лишь значения, и они будут скопированы буквально везде, где они используются во время компиляции, поэтому вы никогда не «вызываете» статические поля во время выполнения. У статического метода не будет такой же семантики, поскольку он будет включать вызов интерфейса без реализации, что не позволяет Java.

person cynicalman    schedule 24.09.2008
comment
Статический метод также является окончательным, поскольку его нельзя переопределить. Hotspot постоянно копирует статические методы классов. - person skaffman; 24.09.2008
comment
Разница здесь в том, что в чистой Java нет способа скопировать указатель на функцию, поэтому, если у вас есть вызов MyInterface.STATIC_FINAL_STTRING в вашем коде, он будет буквально заменен значением. Код все равно нужно будет выполнять через интерфейс без реализации. - person cynicalman; 24.09.2008
comment
К сожалению, время редактирования истекло. С технической точки зрения ничто не говорит против статических методов в интерфейсах. Я готов поспорить, что вы можете вручную создать байт-код, и он сработает. Вам не нужен указатель на функцию. Статические методы вызываются через invokestatic с указателем на пул констант, содержащий имя класса и имя метода. Также ответ выше относительно копирования констант НЕПРАВИЛЬНЫЙ. Статические конечные поля Ofc не копируются компилятором. Используется байт-код getstatic. В противном случае, если вы измените файл Java с помощью константы и перекомпилируете его, все остальные файлы классов будут иметь неправильное значение. - person Angel O'Sphere; 13.05.2011

Причина в том, что все методы, определенные в интерфейсе, являются абстрактными, вне зависимости от того, объявляете ли вы этот модификатор явно или нет. Абстрактный статический метод не является допустимой комбинацией модификаторов, поскольку статические методы нельзя переопределить.

Относительно того, почему интерфейсы допускают статические поля. Есть ощущение, что это следует считать «фичей». Единственная возможность, о которой я могу думать, - это сгруппировать константы, которые будут интересовать реализации интерфейса.

Я согласен, что последовательность была бы лучшим подходом. В интерфейсе не должно быть статических членов.

person laz    schedule 30.09.2008
comment
Вы неправильно поняли вопрос. Прочтите другие отзывы и комментарии. - person skaffman; 30.09.2008

Я считаю, что к статическим методам можно получить доступ без создания объекта, а интерфейс не позволяет создавать объект, чтобы ограничить программистов от использования методов интерфейса напрямую, а не из его реализованного класса. Но если вы определяете статический метод в интерфейсе, вы можете получить к нему доступ напрямую, без его реализации. Таким образом, статические методы не разрешены в интерфейсах. Я не думаю, что последовательность должна вызывать беспокойство.

person prerana gupta    schedule 17.06.2016

Статический метод интерфейса Java 1.8 виден только для методов интерфейса. Если мы удалим метод methodSta1 () из класса InterfaceExample, мы не сможем использовать его для объекта InterfaceExample. Однако, как и другие статические методы, мы можем использовать статические методы интерфейса, используя имя класса. Например, допустимым заявлением будет: exp1.methodSta1 ();

Итак, посмотрев пример ниже, мы можем сказать: 1) Статический метод интерфейса Java является частью интерфейса, мы не можем использовать его для объектов класса реализации.

2) Статические методы интерфейса Java хороши для предоставления служебных методов, например нулевой проверки, сортировки коллекции, журнала и т. Д.

3) Статический метод интерфейса Java помогает нам в обеспечении безопасности, не позволяя классам реализации (InterfaceExample) переопределять их.

4) Мы не можем определить статический метод интерфейса для методов класса Object, мы получим ошибку компилятора, поскольку «Этот статический метод не может скрыть метод экземпляра от Object». Это потому, что это не разрешено в java, поскольку Object является базовым классом для всех классов, и у нас не может быть одного статического метода уровня класса и другого метода экземпляра с той же сигнатурой.

5) Мы можем использовать статические методы интерфейса Java, чтобы удалить служебные классы, такие как Коллекции, и переместить все его статические методы в соответствующий интерфейс, который было бы легко найти и использовать.

public class InterfaceExample implements exp1 {

    @Override
    public void method() {
        System.out.println("From method()");
    }

    public static void main(String[] args) {
        new InterfaceExample().method2();
        InterfaceExample.methodSta2();      //  <---------------------------    would not compile
        // methodSta1();                        //  <---------------------------    would not compile
        exp1.methodSta1();
    }

    static void methodSta2() {          //          <-- it compile successfully but it can't be overridden in child classes
        System.out.println("========= InterfaceExample :: from methodSta2() ======");
    }
}


interface exp1 {

    void method();
    //protected void method1();         //          <--      error
    //private void method2();           //          <--      error
    //static void methodSta1();         //          <--      error it require body in java 1.8

    static void methodSta1() {          //          <-- it compile successfully but it can't be overridden in child classes
        System.out.println("========= exp1:: from methodSta1() ======");
    }

    static void methodSta2() {          //          <-- it compile successfully but it can't be overridden in child classes
        System.out.println("========= exp1:: from methodSta2() ======");
    }

    default void method2() { System.out.println("---  exp1:: from method2() ---");}
    //synchronized default void method3() { System.out.println("---");}             // <-- Illegal modifier for the interface method method3; only public, abstract, default, static 
                                                                                // and strictfp are permitted
    //final default void method3() { System.out.println("---");} //             <--      error
}
person Ashish Sharma    schedule 10.10.2017
comment
interface static method helps us in providing security by not allowing implementation classes to override them Если это вас беспокоит, сделайте метод final для предотвращения переопределений. - person Henrik Aasted Sørensen; 10.10.2017
comment
Мы не могли определить метод final в интерфейсе, и мы хотим определить метод final в каждом классе, который будет иметь такое же поведение, что и при возникновении большого количества повторяющегося кода. По сути, статические методы в интерфейсе добавляют еще одну функциональность: - мы можем добавить аналогичный тип действия и можем вести себя по-разному при реализации классов. Также мы можем сохранить все общие типы действий / поведения в интерфейсе на имя статических методов, если мы думаем, что это поможет нам сохранить некоторый код в текущем дизайне наследования. - person Ashish Sharma; 11.10.2017