Статические классы в Java - PullRequest
       21

Статические классы в Java

882 голосов
/ 20 сентября 2011

Есть ли что-то вроде static class в Java?

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

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

Для чего нужны статические классы?

Ответы [ 10 ]

801 голосов
/ 20 сентября 2011

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

  • Объявите свой класс final - Предотвращает расширение класса, так как расширение статического класса не делаетsense
  • Сделать конструктор 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 действительно был бы статическим.

303 голосов
/ 20 сентября 2011

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

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

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

144 голосов
/ 20 сентября 2011

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

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

пример кода:

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(); 
  }
}
94 голосов
/ 20 сентября 2011

Да, в 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();
32 голосов
/ 18 декабря 2015

Что происходит, когда члены внутри 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 внутреннего класса.

12 голосов
/ 10 октября 2016

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

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

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

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

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

2) Внутренний класс (или нестатический вложенный класс) может обращаться как к статическим, так и к нестатическим членам класса Outer.Статический класс не может получить доступ к нестатическим членам класса Outer.Он может получить доступ только к статическим членам класса Outer.

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

12 голосов
/ 24 февраля 2015

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

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

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

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

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

Блох, Джошуа (2008-05-08). Эффективная Java (Java Series) (стр. 18). Образование Пирсона.

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

8 голосов
/ 20 сентября 2011

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

2 голосов
/ 21 мая 2019

Проще говоря, Java поддерживает объявление класса статическим только для внутренних классов, но не для классов верхнего уровня.

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

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

Следовательно, Java поддерживает статические классы на уровне внутреннего класса (во вложенных классах)

И Java не поддерживает статические классы на классах верхнего уровня.

Надеюсь, это даст более простое решение вопроса для базового понимания статических классов в Java.

0 голосов
/ 20 сентября 2011

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

...