Почему вы не можете объявить класс статическим в Java?
java
static-class
Mariselvam
источник
источник
static
?static
классы какabstract final
, то есть они не могут быть созданы и не могут быть расширены. Это означает, что они могут содержать только статические члены, что полезно для классов, которые содержат только вспомогательные методы.Ответы:
Только вложенные классы могут быть статическими. Таким образом, вы можете использовать вложенный класс, не имея экземпляра внешнего класса.
Источники:
На ту же тему:
источник
Классы верхнего уровня являются статическими по умолчанию. Внутренние классы не являются статичными по умолчанию. Вы можете изменить значение по умолчанию для внутренних классов, явно пометив их как статические. Классы верхнего уровня, в силу того, что они являются верхними уровнями, не могут иметь нестатическую семантику, потому что не может быть родительского класса, на который можно ссылаться. Поэтому нет способа изменить значение по умолчанию для классов верхнего уровня.
источник
static
ключевому слову в классе верхнего уровня обозначать и обеспечивать, чтобы оно могло содержать только статические члены и не создавалось для него; это могло бы, однако, сбить с толку людей, посколькуstatic
имеет другое значение для вложенных классов.Итак, я опаздываю на вечеринку, но вот мои два цента - философски добавляю к ответу Колина Хеберта.
На высоком уровне ваш вопрос касается различий между объектами и типами. В то время как существует много автомобилей (объектов), существует только один класс (тип) автомобилей. Объявление чего-либо как статического означает, что вы работаете в пространстве типа. Здесь только один. Ключевое слово класса верхнего уровня уже определяет тип в пространстве «type». В результате «общедоступный статический класс Car» является избыточным.
источник
Класс с приватным конструктором является статическим.
Объявите свой класс следующим образом:
и вы можете использовать без инициализации:
источник
static class
объявления в C #), компилятор даже не позволит коду объявлять переменные этого типа и не использует его в качестве параметра универсального типа. Простое отсутствие доступных конструкторов в классе, который в противном случае мог бы быть либо создан, либо наследован, не исключало бы объявление переменных этого типа или его использование в качестве параметра универсального типа.Конечно, они могут, но только
внутренниевложенные классы. Там это означает, что экземпляры вложенного класса не требуют включения внешнего класса.Но для классов верхнего уровня разработчики языка не могли придумать ничего полезного, связанного с ключевым словом, поэтому это запрещено.
источник
static
, иногда имеет смысл это сделать. Например, класс, содержащий только статические вспомогательные методы, не имеет смысла создавать экземпляры, но язык Java не мешает вам это делать. Вы можете сделать класс неинстанцируемым (и практически «статичным») для других классов, объявив конструктор по умолчаниюprivate
, который запрещает инстанцирование, поскольку конструктор не виден.Вы можете создать служебный класс (у которого не может быть созданных экземпляров), объявив тип enum без экземпляров. то есть вы конкретно заявляете, что нет никаких экземпляров.
источник
... он может быть объявлен как статический - до тех пор, пока он является членом класса.
Из JLS:
и здесь:
Ключевое слово static не имеет никакого смысла для класса верхнего уровня, просто потому, что класс верхнего уровня не имеет вложенного типа.
источник
Inner
?Nested
был бы менее запутанным выбором.Как объяснено выше, класс не может быть статическим, если он не является членом другого класса.
Если вы хотите спроектировать класс, «которого не может быть несколько экземпляров», вы можете посмотреть шаблон проектирования «Singleton».
Информация для начинающих Singleton здесь .
Предостережение:
источник
В дополнение к тому, как Java определяет статические внутренние классы, есть другое определение статических классов согласно миру C # [1] . Статический класс - это класс, который имеет только статические методы (функции) и предназначен для поддержки процедурного программирования. Такие классы на самом деле не являются классами в том смысле, что пользователь класса интересуется только вспомогательными функциями, а не созданием экземпляров класса. Хотя статические классы поддерживаются в C #, в Java такой прямой поддержки не существует. Однако вы можете использовать перечисления для имитации статических классов C # в Java, чтобы пользователь никогда не мог создавать экземпляры данного класса (даже используя отражение) [2] :
источник
Все, что мы кодируем в Java, входит в класс. Всякий раз, когда мы запускаем класс, JVM создает объект. JVM может создавать несколько объектов, по определению Static означает, что у вас одинаковый набор копий для всех объектов.
Таким образом, если бы Java позволяла верхнему классу быть статичным при каждом запуске программы, она создает объект и переопределяет одно и то же место в памяти.
Если Вы просто заменяете объект каждый раз, когда запускаете его, какой смысл его создавать?
Вот почему Java избавилась от статики для класса верхнего уровня.
Могут быть и более конкретные причины, но для меня это логично.
источник
Единственными классами, которые могут быть статическими, являются внутренние классы. Следующий код работает просто отлично:
Суть статических внутренних классов в том, что они не имеют ссылки на внешний объект класса.
источник
Я думаю, что это возможно так же просто, как выпить стакан кофе! Просто взгляните на это. Мы не используем статическое ключевое слово явно при определении класса.
Разве это не определение статического класса? Мы просто используем функцию, связанную только с классом. Будьте осторожны, чтобы в этом случае мы могли использовать другой класс из этого вложенного. Посмотри на это:
источник
new StaticClass()
и это не имеет особого смысла. С частным конструктором это не позволило бы экземпляры этого.В
PlatformUI
Eclipse можно взглянуть на класс со статическими методами и приватным конструктором, сам по себе являющийся конечным.источник
если преимущество использования статического класса не в том, чтобы создавать экземпляр объекта и использовать метод, тогда просто объявите класс как открытый, а этот метод как статический.
источник