Статические классы в 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 есть "статические вложенные классы", но они совсем не то же самое, что и статические классы С#, если это то, откуда вы пришли. Статический вложенный класс - это просто тот, который не подразумевает ссылку на экземпляр внешнего класса.

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

В 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 объявлен static, вы можете явно создать экземпляр как:

B b = new B();

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

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

Ответ 5

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

Ответ 6

Увидев, что это лучший результат в 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). Образование Пирсона.

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

Ответ 7

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

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

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

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

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

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

глянь сюда: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Ответ 8

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

Ответ 9

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

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

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

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

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

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

Ответ 10

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

public class Outer {
   static class Nested_Demo {
      public void my_method() {
          System.out.println("This is my nested class");
      }
   }
public static void main(String args[]) {
      Outer.Nested_Demo nested = new Outer.Nested_Demo();
      nested.my_method();
   }
}

Ответ 11

Статический метод означает, что к нему можно получить доступ без создания объекта класса, в отличие от public:

public class MyClass {
   // Static method
   static void myStaticMethod() {
      System.out.println("Static methods can be called without creating objects");
   }

  // Public method
  public void myPublicMethod() {
      System.out.println("Public methods must be called by creating objects");
   }

  // Main method
  public static void main(String[ ] args) {
      myStaticMethod(); // Call the static method
    // myPublicMethod(); This would output an error

    MyClass myObj = new MyClass(); // Create an object of MyClass
    myObj.myPublicMethod(); // Call the public method
  }
}

Ответ 12

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

Ответ 13

Использование статических классов просто отлично подходит для группирования. Поскольку Java позволяет нам группировать классы, которые полезны друг для друга, мы группируем их просто для того, чтобы они оставались вместе под одним ключевым словом static.

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

Давайте посмотрим на пример статического класса java и посмотрим, как его можно использовать в java-программе.

public class OuterClass {

private static String name = "Mohammad";

// static nested class
static class StaticNestedClass {
    private int a;

    public int getA() {
        return this.a;
    }

    public String getName() {
        return name;
    }
  }
}

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

public class StaticNestedClassTest {

public static void main(String[] args) {

    //creating instance of static nested class
    OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();

    //accessing outer class static member
    System.out.println(nested.getName());    // Printing "Mohammad"
    }
}

Подробнее см. здесь:

Понимание статического класса в Java | Вложенный класс Java

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

Статический класс Java: шаг вперед в вашем путешествии по программированию на Java

Java вложенный и внутренний класс