О статиках Java и их модификаторах доступа

Если статические члены не наследуются в Java, почему к ним применимы модификаторы доступа (приватные, защищенные...)?

Возможно, я не на 100% ясен в отношении термина "унаследовано": когда они говорят "статика не унаследована", они означают "не видно" или "не может быть переопределено / переопределено" или и то, и другое?

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

Можете ли вы привести примеры, когда использование статического, скажем, частного имеет смысл?

Спасибо

PS: теперь я думаю, что утверждение "Статические переменные в Java не наследуются, они существуют только в классе, который их объявляет", распространяемое здесь и там и вокруг на этом форуме (например: Каковы правила, предписывающие наследование статических переменных в Java?) НЕ правильно

Спецификация языка Java #8.4.8 гласит:

8.4.8 Наследование, переопределение и сокрытие

Класс C наследует от своего прямого суперкласса все конкретные методы m (как статические, так и экземпляры) суперкласса, для которых выполняются все следующие условия:

m является членом прямого суперкласса C. m является публичным, защищенным или объявленным с доступом к пакету в том же пакете, что и C. Ни один из методов, объявленных в C, не имеет подписи, которая является подписью (§8.4.2) подписи м.

3 ответа

Если статические члены не наследуются в Java, почему к ним применимы модификаторы доступа (приватные, защищенные...)?

Кто сказал, что статические члены не могут наследоваться, обратитесь к JLS (пример 8.2-2). пример

В Java " статический " просто означает, что для доступа к этому полю / методу не требуется никакого объекта.

" private " - это просто модификатор доступа, который означает, что к следующему полю / методу нельзя получить доступ вне его, и к нему может получить доступ только этот класс или любой внутренний класс.

Единственное, что со "статическими" методами суперкласса, унаследованного в подклассе, может быть прочитано из приведенного ниже фрагмента из JLS:

Если класс C объявляет или наследует статический метод m, то говорят, что m скрывает любой метод m ', где сигнатура m является подписями (§8.4.2) сигнатуры m', в суперклассах и суперинтерфейсах C, который в противном случае был бы доступен для кода на C.

Таким образом, в основном вы не можете переопределить статический метод, но вы, безусловно, можете наследовать статический метод, если он не скрыт подклассом.

Прочитайте следующий раздел JLS (§8.4.8.2. Сокрытие (методами класса)) о сокрытии методов класса.

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

введите описание изображения здесь

static член в классе просто означает, что он будет общим для всех объектов класса. Новая переменная не будет создаваться для каждого экземпляра класса.

Модификаторы доступа управляют видимостью переменных в Java. Значение модификаторов доступа одинаково для статических и нестатических элементов. Это не имеет ничего общего только со статическими членами.

Что касается вашего вопроса, использование модификаторов доступа в статических переменных означает следующее:

private static count: Счетчик статических членов виден только классу, который его определяет. Однако, если вы унаследуете класс, определяющий эту статическую переменную, ваш унаследованный класс не сможет напрямую получить к ней доступ. count можно получить, только если суперкласс имеет getter определяется для него, или если модификатор доступа изменяется на public или же protected.

Видимость членов относится не только к дочерним классам. Из Oracle они применяются, в отношении static член, к остальной части пакета, или остальной части "мира".

Если вы создаете private static член, вы утверждаете, что это член исключительно для этого конкретного класса. Затем вы продвигаетесь вверх по цепочке видимости:

  • private наименее заметен,
  • <no modifier> (или защищенный пакет) является вторым наименее видимым,
  • protected является вторым наиболее заметным, и
  • public является наиболее видимым

Я не видел, чтобы кто-нибудь действительно использовал protected static член, даже если это действительный Java. Конвенция гласит, что это должно быть видимой константой (в этом случае это вероятно public), или менее чем видимая константа для тестового воздействия (что оправдало бы видимость, защищенную упаковкой).

Другие вопросы по тегам