Что означает такой класс? Все ли методы статического класса должны быть static такими же?
Требуется ли и наоборот? Что, если класс содержит только статические методы, класс тоже должен быть статичным?
Для чего хороши статические классы?
Переведено автоматически
Ответ 1
В Java есть статические вложенные классы, но звучит так, будто вы ищете статический класс верхнего уровня. В Java нет способа сделать класс верхнего уровня статичным, но вы можете смоделировать статический класс, подобный этому:
Объявите свой класс final - Предотвращает расширение класса, поскольку расширение статического класса не имеет смысла
Создать конструктор private - Предотвращает создание экземпляра клиентским кодом, поскольку нет смысла создавать экземпляр статического класса
Создайте все члены и функции класса static - Поскольку класс не может быть создан, нельзя вызывать методы экземпляра или обращаться к полям экземпляра
Обратите внимание, что компилятор не помешает вам объявить элемент экземпляра (нестатический). Проблема возникнет только при попытке вызвать элемент экземпляра
Простой пример в соответствии с предложениями выше:
publicclassTestMyStaticClass { publicstaticvoidmain(String []args){ MyStaticClass.setMyStaticMember(5); System.out.println("Static value: " + MyStaticClass.getMyStaticMember()); System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember()); // MyStaticClass x = new MyStaticClass(); // results in compile time error } }
Чем хороши статические классы? Статический класс полезно использовать для определения одноразовых, служебных и / или библиотечных классов, создание экземпляров которых не имело бы смысла. Отличным примером является класс Math, который содержит некоторые математические константы, такие как PI и E, и просто предоставляет математические вычисления. Требовать создания экземпляра в таком случае было бы излишне и сбивало с толку. Посмотрите на Math класс и исходный код. Обратите внимание, что это final и все его члены static. Если бы Java разрешала объявлять классы верхнего уровня static, то класс Math действительно был бы статическим.
Ответ 2
Ну, в Java есть "статические вложенные классы", но они совсем не совпадают со статическими классами C #, если вы исходили именно из этого. Статический вложенный класс - это всего лишь тот, который неявно не содержит ссылки на экземпляр внешнего класса.
Статические вложенные классы могут иметь методы экземпляра и статические методы.
В Java нет такого понятия, как статический класс верхнего уровня.
Ответ 3
Существует статический вложенный класс, этому [статическому вложенному] классу не нужен экземпляр заключающего класса, чтобы быть созданным самому.
Эти классы [статические вложенные классы] могут обращаться только к статическим членам заключающего класса [поскольку у него нет никаких ссылок на экземпляры заключающего класса ...]
пример кода:
publicclassTest { classA { } staticclassB { } publicstaticvoidmain(String[] args) { /*will fail - compilation error, you need an instance of Test to instantiate A*/ Aa=newA(); /*will compile successfully, not instance of Test is needed to instantiate B */ Bb=newB(); } }
Ответ 4
Да, в Java существует статический вложенный класс. Когда вы объявляете вложенный класс static , он автоматически становится автономным классом, экземпляр которого может быть создан без необходимости создавать экземпляр внешнего класса, к которому он принадлежит.
Пример:
publicclassA {
publicstaticclassB { } }
Поскольку class B объявлен статическим, вы можете явно создать экземпляр как:
Bb=newB();
Примечание, если class B не был объявлен статическим, чтобы сделать его автономным, вызов объекта экземпляра выглядел бы следующим образом: