Почему переменная, используемая в интерфейсе, является PUBLIC STATIC FINAL? Почему "статический" в частности?
Переменные в интерфейсе
Ответ 1
Поле, объявленное в интерфейсе, может быть только константой в любом случае, так почему это зависит от того, какой экземпляр вы используете для доступа к нему?
Помещение полей в интерфейсы часто плохое в любом случае в наши дни. Интерфейс предназначен для отражения возможностей классов, которые его реализуют, что полностью ортогонально идее константы. Это, конечно, неприятная идея использовать интерфейс, чтобы объявить кучу констант. Иногда мне кажется полезным использовать тип интерфейса, который представляет собой простые реализации, поэтому интерфейс фильтрации может иметь, например, поля "ALLOW_ALL" и "ALLOW_NONE".
Я предполагаю, что вы могли бы представить себе сценарий, в котором реализация интерфейса действительно добавила поле экземпляра в ваш класс, но это нарушит инкапсуляцию не только в том смысле, что она будет неявно публичной, но и путем указания части реализации вместо API.
Ответ 2
Потому что вы не можете создать интерфейс. Также не может быть какого-либо тела метода для использования нестатической не конечной переменной.
Ответ 3
Почему бы не быть статичным?
Это константа, связанная с интерфейсом, а не с каким-либо конкретным экземпляром.
Ответ 4
Основная причина, по которой я предполагаю, - это детализация VM/language.
Если интерфейсу не разрешено иметь нестатические переменные, нет необходимости выделять память для интерфейса во время создания класса. Также нет необходимости в специальных механизмах именования/переименования, если вы наследуете переменные с тем же именем. Единственное, что вам нужно, это некоторая таблица для вызова правильных функций при использовании интерфейса.
Вкратце - это облегчает жизнь помощника по языку/виртуальной машине. Если вы действительно хотите взглянуть на множественное наследование и его подводные камни и ловушки, прочитайте "Объектно-ориентированное программное обеспечение" Бертран Майер (2-е издание). Тогда вы понимаете, почему интерфейс должен быть таким простым (и, тем не менее, архивирует большинство вещей, на которые наследуется множественное наследование).
Ответ 5
Интерфейс контракт, который определяет взаимодействие между объектами.
Это взаимодействие определяется открытыми методами, а не переменными. Переменные будут описывать только внутреннюю работу, а не взаимодействие.
Обратите внимание, что переменные никогда не должны использоваться для взаимодействия. Согласно принципу ООП инкапсуляции, было бы преступлением позволить 1 классу получить доступ к переменной другого класса напрямую.
Константы (например, Math.PI
) являются единственным приемлемым исключением. Поскольку константы являются единственным видом переменных, к которым могут обращаться непосредственно другие классы, не нарушая принцип инкапсуляции, все переменные в интерфейсе рассматриваются как переменные public static final
(т.е. Константы)