Статические Классы В Java

что-нибудь вроде static class на java?

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

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

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

9 ответов


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

  • объявить свой класс final - предотвращает расширение класса, так как расширение статического класса не имеет смысла
  • конструктор private - предотвращает создание экземпляра клиентским кодом, поскольку нет смысла создавать статический экземпляр класс!--10-->
  • сделать все члены и функции класса static - поскольку класс не может быть создан, никакие методы экземпляра не могут быть вызваны или доступ к полям экземпляра
  • обратите внимание, что компилятор не помешает вам объявить экземпляр (не-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;
    }
}

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


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

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

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


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

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

код:

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(); 
  }
}

Да существует статический вложенный класс в 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..? К членам можно получить доступ без создания экземпляра class. Поэтому создание внешнего класса (класс верхнего уровня) 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 члены внутри non-static внутренний класс.


видя, что это лучший результат в Google для "статического класса java", и лучший ответ не здесь, я решил добавить его. Я интерпретирую вопрос OP как относительно статических классов в C#, которые известны как синглеты в мире Java. Для тех, кто не знает, в C# ключевое слово "static" может быть применено к объявлению класса, что означает, что результирующий класс никогда не может быть создан.

выдержка из "эффективного Java-второго издания" Джошуа Блоха (широко считается один из лучших доступных руководств по стилю Java):

начиная с выпуска 1.5 существует третий подход к реализации синглетов. Просто сделайте тип перечисления с одним элементом:

// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;
    public void leaveTheBuilding() { ... }
}

этот подход функционально эквивалентен подходу public field, за исключением того, что он более лаконичен, предоставляет механизм сериализации бесплатно и обеспечивает железную гарантию против множественного создания экземпляра, даже перед лицом сложной сериализации или отражение атак. Хотя этот подход еще не получил широкого распространения, a одноэлементный тип перечисления-лучший способ реализовать синглтон. (курсив автора)

Bloch, Joshua (2008-05-08). Эффективная Java (Java Series) (p. 18). Образование Пирсона.

Я думаю, что реализация и обоснование довольно понятны.


может ли класс быть статическим в Java ?

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

в java мы не можем сделать статический класс верхнего уровня (внешний). статическими могут быть только вложенные классы.

статический вложенный класс vs нестатический вложенный класс

1) вложенный статический класс не нуждается в ссылке внешнего класса, но Нестатический вложенный класс или внутренний класс требует внешнего класса ссылка.

2) внутренний класс(или нестатический вложенный класс) может получить доступ к статической и нестатические члены внешнего класса. Статический класс не может получить доступ нестатические члены внешнего класса. Он может получить доступ только к статическим члены космического класс.

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html


внешние классы не могут быть статическими, но вложенные/внутренние классы могут быть. Это в основном помогает вам использовать вложенный / внутренний класс без создания экземпляра внешнего класса.


Java имеет статические методы, связанные с классами (например, java.ленг.Математика имеет только статические методы), но сам класс не является статическим.