Вопрос-ответ

What is a "static class" in Java?

Что такое "статический класс" в Java?

Есть ли что-нибудь подобное static class в Java?

Что означает такой класс? Все ли методы статического класса должны быть static такими же?

Требуется ли и наоборот? Что, если класс содержит только статические методы, класс тоже должен быть статичным?

Для чего хороши статические классы?

Переведено автоматически
Ответ 1

В Java есть статические вложенные классы, но звучит так, будто вы ищете статический класс верхнего уровня. В Java нет способа сделать класс верхнего уровня статичным, но вы можете смоделировать статический класс, подобный этому:


  • Объявите свой класс final - Предотвращает расширение класса, поскольку расширение статического класса не имеет смысла

  • Создать конструктор private - Предотвращает создание экземпляра клиентским кодом, поскольку нет смысла создавать экземпляр статического класса

  • Создайте все члены и функции класса static - Поскольку класс не может быть создан, нельзя вызывать методы экземпляра или обращаться к полям экземпляра

  • Обратите внимание, что компилятор не помешает вам объявить элемент экземпляра (нестатический). Проблема возникнет только при попытке вызвать элемент экземпляра

Простой пример в соответствии с предложениями выше:

public class TestMyStaticClass {
public static void main(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
}
}

// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
private MyStaticClass () { // private constructor
myStaticMember = 1;
}
private static int myStaticMember;
public static void setMyStaticMember(int val) {
myStaticMember = val;
}
public static int getMyStaticMember() {
return myStaticMember;
}
public static int squareMyStaticMember() {
return myStaticMember * myStaticMember;
}
}

Чем хороши статические классы? Статический класс полезно использовать для определения одноразовых, служебных и / или библиотечных классов, создание экземпляров которых не имело бы смысла. Отличным примером является класс Math, который содержит некоторые математические константы, такие как PI и E, и просто предоставляет математические вычисления. Требовать создания экземпляра в таком случае было бы излишне и сбивало с толку. Посмотрите на Math класс и исходный код. Обратите внимание, что это final и все его члены static. Если бы Java разрешала объявлять классы верхнего уровня static, то класс Math действительно был бы статическим.

Ответ 2

Ну, в Java есть "статические вложенные классы", но они совсем не совпадают со статическими классами C #, если вы исходили именно из этого. Статический вложенный класс - это всего лишь тот, который неявно не содержит ссылки на экземпляр внешнего класса.

Статические вложенные классы могут иметь методы экземпляра и статические методы.

В Java нет такого понятия, как статический класс верхнего уровня.

Ответ 3

Существует статический вложенный класс, этому [статическому вложенному] классу не нужен экземпляр заключающего класса, чтобы быть созданным самому.

Эти классы [статические вложенные классы] могут обращаться только к статическим членам заключающего класса [поскольку у него нет никаких ссылок на экземпляры заключающего класса ...]

пример кода:

public class Test { 
class A { }
static class B { }
public static void main(String[] args) {
/*will fail - compilation error, you need an instance of Test to instantiate A*/
A a = new A();
/*will compile successfully, not instance of Test is needed to instantiate B */
B b = new B();
}
}
Ответ 4

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

Пример:

public class A
{

public static class B
{
}
}

Поскольку class B объявлен статическим, вы можете явно создать экземпляр как:

B b = new B();

Примечание, если class B не был объявлен статическим, чтобы сделать его автономным, вызов объекта экземпляра выглядел бы следующим образом:

A a= new A();
B b = a.new B();
java