Что такое "статический класс" в Java? [закрыто]
Проблема:
У меня возник вопрос о том, существует ли что-то подобное static class
в Java? Что обозначает такой класс? Все методы в статическом классе также должны быть static
? И нужно ли, чтобы наоборот — если класс содержит только статические методы, сам класс также был статическим? Для чего вообще нужны статические классы?
Пожалуйста, помогите мне прояснить эти моменты!
5 ответ(ов)
В Java есть "статические вложенные классы", но они совершенно не то же самое, что статические классы в C#, если вы исходили из этого предположения. Статический вложенный класс — это просто класс, который не имеет неявной ссылки на экземпляр внешнего класса.
Статические вложенные классы могут иметь как экземплярные методы, так и статические методы.
В Java не существует концепции топ-уровневого статического класса.
Да, в Java действительно существует статический вложенный класс. Когда вы объявляете вложенный класс как статический, он автоматически становится независимым классом, который можно создавать без необходимости создания экземпляра внешнего класса, к которому он принадлежит.
Пример:
public class A
{
public static class B
{
}
}
Поскольку class B
объявлен как статический, его можно явно создать следующим образом:
B b = new B();
Обратите внимание, если бы class B
не был объявлен как статический, для создания его экземпляра вам пришлось бы сначала создать объект внешнего класса:
A a = new A();
B b = a.new B();
Когда члены внутри class
объявлены как static
, они могут быть доступны без создания экземпляра этого класса. Поэтому иметь внешний класс (топ-уровень класс) как static
не имеет смысла, и это не разрешено.
Однако вы можете объявить внутренние классы как static
, поскольку они являются членами верхнего уровня класса. В таком случае, к этому классу можно обратиться без создания экземпляра верхнего уровня класса. Рассмотрим следующий пример:
public class A {
public static class B {
}
}
Теперь, внутри другого класса C
, класс B
может быть доступен без создания экземпляра класса A
:
public class C {
A.B ab = new A.B();
}
static
классы могут также иметь non-static
члены. Только сам класс становится статическим.
Но если убрать static
ключевое слово из класса B
, его нельзя будет использовать напрямую без создания экземпляра A
:
public class C {
A a = new A();
A.B ab = a.new B();
}
При этом мы не можем иметь static
члены внутри нестатического внутреннего класса.
Можно ли создать статический класс в Java?
Ответ — ДА, в Java можно использовать статические классы. У нас есть статические переменные экземпляра, статические методы и статические блоки. Также в Java можно объявлять статические классы.
Однако, важно отметить, что нельзя сделать статический класс верхнего уровня (внешний класс). Только вложенные классы могут быть статическими.
Разница между статическим вложенным классом и нестатическим вложенным классом:
Статический вложенный класс не требует ссылки на внешний класс, тогда как нестатический вложенный класс (или внутренний класс) требует ссылки на внешний класс.
Внутренний класс (или нестатический вложенный класс) может получать доступ как к статическим, так и к нестатическим членам внешнего класса. Статический класс может получать доступ только к статическим членам внешнего класса и не может обращаться к нестатическим членам.
Больше информации можно найти здесь: документация Oracle.
Поскольку это лучший результат в Google по запросу "статический класс java", а наилучшего ответа здесь нет, я решил добавить свой. Я интерпретирую вопрос автора как касающийся статических классов в C#, которые в мире Java известны как одиночки (singletons). Для тех, кто не знает, в C# ключевое слово "static" может применяться к объявлению класса, что означает, что полученный класс никогда не может быть инстанцирован.
Из книги "Effective Java - Второе издание" Джошуа Блоха (широко считается одной из лучших книг по стилю Java):
С версии 1.5 существует третий подход к реализации одиночек. Просто создайте перечисляемый тип с одним элементом:
// Enum singleton - предпочтительный подход public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } }
Этот подход функционально эквивалентен методу с публичным полем, за исключением того, что он более лаконичен, предоставляет механизм сериализации бесплатно и предоставляет надежную гарантию против множественной инстанциации, даже перед сложными атаками с использованием сериализации или рефлексии. Хотя этот подход пока не получил широкого распространения, *** одиночный перечисляемый тип с одним элементом — лучший способ реализовать одиночку.*** (выделение автора)
Блох, Джошуа (2008-05-08). Effective Java (Java Series) (стр. 18). Pearson Education.
Думаю, реализация и обоснование довольно самодостаточны.
Внутренние классы и статические вложенные классы в Java
Как работают сервлеты? Инстанцирование, сессии, общие переменные и многопоточность
Java 8: Преобразование List<V> в Map<K, V>
Возможные значения конфигурации hbm2ddl.auto в Hibernate и их назначение
Что такое PECS (Producer Extends Consumer Super)?