Есть ли что-нибудь, как static class
в Java?
В чем смысл такого класса. Все ли методы статического класса должны бытьstatic
тоже ?
Требуется ли наоборот, если класс содержит все статические методы, должен ли класс быть статическим?
Для чего нужны статические классы?
java
static-classes
Kraken
источник
источник
Ответы:
В Java есть статические вложенные классы, но, похоже, вы ищете статический класс верхнего уровня. В Java нет способа сделать класс верхнего уровня статическим, но вы можете имитировать статический класс следующим образом:
final
- Предотвращает расширение класса, так как расширение статического класса не имеет смыслаprivate
- предотвращает создание экземпляров клиентским кодом, так как нет смысла создавать экземпляры статического класса.static
- Поскольку класс не может быть создан, никакие методы экземпляра не могут быть вызваны или поля экземпляра доступныПростой пример согласно предложениям сверху:
Что хорошего в статических классах? Хорошее использование статического класса - это определение одноразовых, служебных и / или библиотечных классов, в которых создание экземпляров не имело бы смысла. Отличным примером является класс Math, который содержит некоторые математические константы, такие как PI и E, и просто предоставляет математические вычисления. Требование инстанцирования в таком случае было бы ненужным и запутанным. Смотрите
Math
класс и исходный код . Обратите внимание, что это такfinal
и все его участникиstatic
. Если бы Java позволяла объявлять классы верхнего уровня,static
тогда класс Math действительно был бы статическим.источник
Foo
только сstatic
методами не совпадает сstatic class Foo
Ну, у Java есть «статические вложенные классы», но они совсем не похожи на статические классы C #, если вы туда пришли. Статический вложенный класс - это просто класс, который неявно не имеет ссылки на экземпляр внешнего класса.
Статические вложенные классы могут иметь методы экземпляра и статические методы.
В Java нет такого понятия, как статический класс верхнего уровня.
источник
static
при объявлении их. Они неявно статичны в том смысле, что для их создания вам не нужна ссылка на что-либо еще. Лично я нахожу статическую / нестатическую терминологию немного странной для вложенных классов в любом случае ... Я думаю, что было бы проще говорить о поведении.Существует статический вложенный класс , этот [статический вложенный] класс не нуждается в экземпляре включающего класса для того, чтобы создать его экземпляр.
Эти классы [статические вложенные] могут обращаться только к статическим членам включающего класса [поскольку они не имеют никакой ссылки на экземпляры включающего класса ...]
Пример кода:
источник
Да, в Java есть статический вложенный класс. Когда вы объявляете вложенный класс статическим, он автоматически становится автономным классом, который может быть создан без создания экземпляра внешнего класса, к которому он принадлежит.
Пример:
Поскольку
class B
объявлено как статическое, вы можете явно создать его как:Обратите внимание, если бы
class B
не было объявлено статическое, чтобы сделать его автономным, вызов объекта экземпляра выглядел бы так:источник
B b = new B();
если вы пытаетесь создать экземпляр из самого классаA
.Что происходит, когда члены внутри
class
объявлены какstatic
..? Это члены могут быть доступны без создания экземпляраclass
. Поэтому создание внешнего класса (класса верхнего уровня)static
не имеет смысла. Поэтому это не разрешено.Но вы можете установить внутренние классы как статические (так как они являются членами класса верхнего уровня). Затем к этому классу можно получить доступ без создания экземпляра класса верхнего уровня. Рассмотрим следующий пример.
Теперь внутри другого класса доступ к
C
классуB
возможен без создания экземпляра классаA
.static
у классовnon-static
тоже могут быть члены. Только класс становится статичным.Но если
static
ключевое слово удалено из классаB
, к нему нельзя получить прямой доступ без создания экземпляраA
.Но мы не можем иметь
static
членов внутриnon-static
внутреннего класса.источник
static
имеет только одно значение в Java. Если что-то находитсяstatic
в классе, это означает, что к нему можно получить доступ без создания экземпляра этого класса. Это ничего не говорит о создании экземпляров или нет ..Видя, что это лучший результат в Google для "статического класса java", и лучший ответ здесь не здесь, я решил добавить его. Я интерпретирую вопрос OP относительно статических классов в C #, которые известны как синглтоны в мире Java. Для тех, кто не знает, в C # ключевое слово «static» может быть применено к объявлению класса, что означает, что результирующий класс никогда не может быть создан.
Отрывок из «Эффективного Java - Второе издание» Джошуа Блоха (широко считается одним из лучших доступных руководств по стилю Java):
Блох, Джошуа (2008-05-08). Эффективная Java (Java Series) (стр. 18). Пирсон Образование.
Я думаю, что реализация и обоснование довольно очевидны.
источник
Может ли класс быть статическим в Java?
Ответ ДА , у нас может быть статический класс в Java. В Java у нас есть статические переменные экземпляра, а также статические методы, а также статический блок . Классы также можно сделать статическими в Java.
В Java мы не можем сделать класс верхнего уровня (внешний) статическим. Только вложенные классы могут быть статическими.
статический вложенный класс против нестатического вложенного класса
1) Вложенный статический класс не нуждается в ссылке на внешний класс, но нестатический вложенный класс или внутренний класс требует ссылки на внешний класс.
2) Внутренний класс (или нестатический вложенный класс) может обращаться как к статическим, так и к нестатическим членам класса Outer. Статический класс не может получить доступ к нестатическим членам класса Outer. Он может получить доступ только к статическим членам класса Outer.
смотрите здесь: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
источник
Внешние классы не могут быть статическими, но могут быть вложенные / внутренние классы. Это в основном помогает вам использовать вложенный / внутренний класс без создания экземпляра внешнего класса.
источник
Проще говоря, Java поддерживает объявление класса статичным только для внутренних классов, но не для классов верхнего уровня.
классы верхнего уровня: проект Java может содержать более одного класса верхнего уровня в каждом исходном файле Java, один из классов назван в честь имени файла. Перед классами верхнего уровня допускаются только три параметра или ключевые слова: public, abstract и final .
Внутренние классы: классы, которые находятся внутри класса верхнего уровня, называются внутренними классами, что в основном является концепцией вложенных классов. Внутренние классы могут быть статичными . Идея сделать статические внутренние классы состоит в том, чтобы воспользоваться преимуществами создания экземпляров объектов внутренних классов без создания экземпляра объекта класса верхнего уровня. Это точно так же, как статические методы и переменные работают внутри класса верхнего уровня.
Следовательно, Java поддерживает статические классы на уровне внутреннего класса (во вложенных классах)
И Java не поддерживает статические классы на классах верхнего уровня.
Я надеюсь, что это дает более простое решение вопроса для базового понимания статических классов в Java.
источник
В Java есть статические методы, которые связаны с классами (например, java.lang.Math имеет только статические методы), но сам класс не является статическим.
источник
Вы не можете использовать статическое ключевое слово с классом, если это не внутренний класс. Статический внутренний класс - это вложенный класс, который является статическим членом внешнего класса. Доступ к нему можно получить без создания экземпляра внешнего класса, используя другие статические члены. Как и статические члены, статический вложенный класс не имеет доступа к переменным экземпляра и методам внешнего класса.
источник
static
ключевое слово с классом, если это не вложенный класс. «Статическое внутреннее» является противоречием в терминах .Статический метод означает, что к нему можно получить доступ без создания объекта класса, в отличие от public:
источник
Все хорошие ответы, но я не видел ссылки на java.util.Collections, которая использует тонны статического внутреннего класса для своих методов статического фактора. Так что добавляя то же самое.
Добавление примера из java.util.Collections, который имеет несколько статических внутренних классов. Внутренние классы полезны для группировки кода, к которому нужно обращаться через внешний класс.
Вот метод статического фактора в классе java.util.Collections
источник