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

634

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

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

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

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

  • 2
    Вы можете быть заинтересованы в stackoverflow.com/questions/3584113/java-static-class
  • 0
    Статические классы в основном используются для группировки классов вместе.
Теги:
static-classes

9 ответов

664
Лучший ответ

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, и просто обеспечивает математические вычисления. Требование создания экземпляра в таком случае было бы ненужным и запутанным. См. класс Java Math. Обратите внимание, что он является окончательным, и все его члены статичны. Если Java разрешал классы верхнего уровня объявляться статическими, то класс Math действительно был бы статическим.

  • 29
    класс Foo только со static методами не совпадает со static class Foo
  • 0
    Должны ли методы быть окончательными?
Показать ещё 14 комментариев
248

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

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

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

  • 10
    В Java Почему статический вложенный класс допускает методы экземпляра? Какая польза от метода экземпляра в таком классе?
  • 18
    @ Geek: ты читал мой ответ? Прочитайте второе предложение внимательно. Почему вы не хотите иметь возможность иметь методы экземпляров статических классов? В конце концов, вы можете создавать их экземпляры.
Показать ещё 8 комментариев
106

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

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

пример кода:

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(); 
  }
}
  • 1
    Итак, можем ли мы сказать, что мы можем использовать внутренние статические классы для создания их экземпляров без необходимости делать их открытыми?
  • 0
    @moldovean Мы используем внутренние статические классы, чтобы создавать их экземпляры из статического контекста (такого как main). Я не думаю, что это имеет какое-либо отношение к видимости.
Показать ещё 1 комментарий
66

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

Пример:

public class A
{

 public static class B
 {
 }
}

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

B b = new B();

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

A a= new A();
B b = a.new B();
  • 7
    обратите внимание, что вы можете создавать экземпляры нестатического класса регулярно, например, B b = new B(); если вы пытаетесь создать его экземпляр из самого класса A
  • 3
    Это объяснение гораздо понятнее, чем остальные.
22

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

  • 0
    Можем ли мы создать экземпляр статического класса или это имеет смысл?
  • 3
    В отличие от других языков, у static есть только одно значение в Java. Если что-то static в классе, это означает, что к нему можно получить доступ без создания экземпляра этого класса. Это ничего не говорит о создании экземпляров или нет ..
Показать ещё 1 комментарий
9

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

8

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

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

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

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

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

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

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

  • 5
    Хороший способ реализовать Singleton. К сожалению, вопрос не о синглетонах, а о статических классах
  • 1
    У Java довольно уникальная интерпретация «статического» ключевого слова. Похоже, что OP исходит из C #, где «статический класс» является эквивалентом синглтона в Java. Я обновил свой ответ, чтобы прояснить эту интерпретацию вопроса.
Показать ещё 1 комментарий
6

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

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

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

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

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

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

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

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню