Klasy Statyczne W Javie

Czy jest coś takiego jak static class w Javie?

Jakie jest znaczenie takiej klasy. Czy wszystkie metody klasy statycznej też muszą być static?

Czy jest wymagane odwrotnie, że jeśli klasa zawiera wszystkie metody statyczne, czy klasa powinna być również statyczna?

Do czego służą klasy statyczne?
Author: Mark, 2011-09-20

9 answers

Java ma klasy statyczne zagnieżdżone, ale wygląda na to, że szukasz klasy statycznej najwyższego poziomu. W Javie nie ma możliwości statycznej klasy najwyższego poziomu, ale można symulować statyczną klasę w taki sposób:

  • Declare your class final - zapobiega rozszerzeniu klasy, ponieważ rozszerzenie statycznej klasy nie ma sensu
  • Make the constructor private - zapobiega tworzeniu instancji przez kod klienta, ponieważ nie ma sensu tworzyć instancji statycznej klasy
  • Make all the członkowie i funkcje klasy static - ponieważ klasy nie można utworzyć instancji, nie można wywoływać żadnych metod instancji ani uzyskiwać dostępu do pól instancji
  • zauważ, że kompilator nie uniemożliwi ci zadeklarowania instancji (niestatycznego) członka. Problem pojawi się tylko wtedy, gdy spróbujesz wywołać członka instancji

Prosty przykład na sugestie z góry:

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

Po co są zajęcia statyczne? dobrym zastosowaniem klasy statycznej jest definiowanie, klasy użytkowe i / lub biblioteki, w których tworzenie instancji nie miałoby sensu. Doskonałym przykładem jest klasa matematyczna, która zawiera pewne stałe matematyczne, takie jak PI i E i po prostu zapewnia obliczenia matematyczne. Wymaganie instancji w takim przypadku byłoby niepotrzebne i mylące. Zobacz klasę matematyki Javy . Zauważ, że jest ostateczny, a wszyscy jego członkowie są statyczni. Gdyby Java pozwalała na deklarowanie klas najwyższego poziomu jako statycznych, Klasa matematyczna byłaby rzeczywiście statyczna.

 728
Author: Paul Sasik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-06 16:38:12

Cóż, Java ma "klasy zagnieżdżone statycznie", ale wcale nie są takie same jak statyczne klasy C#, jeśli właśnie z nich pochodzisz. Statyczna Klasa zagnieżdżona to tylko taka, która w sposób niejawny nie ma odniesienia do instancji klasy zewnętrznej.

Statyczne klasy zagnieżdżone mogą mieć metody instancji i metody statyczne.

Nie ma czegoś takiego jak statyczna klasa najwyższego poziomu w Javie.

 283
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-20 13:35:24

Istnieje statyczna klasa zagnieżdżona , ta [statyczna zagnieżdżona] klasa nie potrzebuje instancji klasy zamykającej, aby sama została utworzona.

Te klasy [statyczne zagnieżdżone] mają dostęp tylko do statycznych członków klasy zamykającej [ponieważ nie mają żadnego odniesienia do instancji klasy zamykającej...]

Próbka kodu:

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(); 
  }
}
 128
Author: amit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-14 19:30:42

Tak istnieje statyczna Klasa zagnieżdżona w Javie. Kiedy deklarujesz klasę zagnieżdżoną statyczną, automatycznie staje się ona samodzielną klasą, którą można utworzyć bez konieczności tworzenia instancji zewnętrznej klasy, do której należy.

Przykład:

public class A
{

 public static class B
 {
 }
}

Ponieważ class B jest zadeklarowana jako statyczna, możesz jawnie utworzyć instancję jako:

B b = new B();

Uwaga Jeśli class B nie zostało zadeklarowane jako statyczne, aby stało się samodzielne, wywołanie obiektu instancji wyglądałoby tak:

A a= new A();
B b = a.new B();
 85
Author: Bitmap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-18 21:33:12

Co się dzieje, gdy członek wewnątrz {[3] } jest zadeklarowany jako static..? Że Członkowie mogą być dostępne bez tworzenia instancji class. Dlatego Tworzenie klasy zewnętrznej (klasy najwyższego poziomu) static nie ma znaczenia. Dlatego nie jest to dozwolone.

Ale możesz ustawić klasy wewnętrzne jako statyczne (ponieważ jest członkiem klasy najwyższego poziomu). Wtedy ta klasa może być dostępna bez tworzenia instancji klasy najwyższego poziomu. Rozważ poniższy przykład.

public class A {
    public static class B {

    }
}

Teraz, wewnątrz innej klasy C, Klasa B może być dostępna bez tworzenia instancji klasy A.

public class C {
    A.B ab = new A.B();
}

static klasy mogą również posiadać non-static członków. Tylko Klasa robi się statyczna.

Ale jeśli słowo kluczowe static zostanie usunięte z klasy B, nie będzie można uzyskać do niego bezpośredniego dostępu bez utworzenia instancji A.

public class C {
    A a = new A();
    A.B ab = a. new B();
}

Ale nie możemy mieć static członków wewnątrz non-static klasy wewnętrznej.

 28
Author: Ramesh-X,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-18 06:05:18

Widząc, że jest to najlepszy wynik w Google dla "static class java", A najlepszej odpowiedzi nie ma tutaj, pomyślałem, że ją dodam. Interpretuję pytanie OP jako dotyczące klas statycznych w C#, które w świecie Javy są znane jako singletony. Dla osób nieświadomych, w C# słowo kluczowe "static"może być zastosowane do deklaracji klasy, co oznacza, że wynikowa klasa nie może być utworzona.

Fragment "Effective Java-Second Edition" Joshuy Bloch (powszechnie uważany za jednego z najlepsze dostępne poradniki w stylu Java):

Począwszy od wydania 1.5, istnieje trzecie podejście do implementacji singletonów. Wystarczy utworzyć typ enum z jednym elementem:

// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;
    public void leaveTheBuilding() { ... }
}
[1]}to podejście jest funkcjonalnie równoważne z podejściem w terenie publicznym, z tym wyjątkiem, że jest bardziej zwięzłe, zapewnia maszynerię serializacji za darmo i zapewnia żelazną gwarancję przed wieloma instancjami, nawet w obliczu wyrafinowanych ataków serializacji lub odbicia. Podczas gdy to podejście nie zostało jeszcze szeroko przyjęte, Jednoelementowy typ enum jest najlepszym sposobem implementacji Singletona. (podkreślenie autora)

Bloch, Joshua (2008-05-08). Skuteczna Java (Seria Java) (str. 18). Pearson Education.

Myślę, że wdrożenie i uzasadnienie są dość oczywiste.

 11
Author: Bennet Huber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-13 18:34:01

Czy klasa może być statyczna w Javie ?

Odpowiedź brzmi tak , możemy mieć statyczną klasę w Javie. W Javie mamy statyczne zmienne instancji, jak również statyczne metody oraz statyczny blok. Klasy mogą być również statyczne w Javie.

W Javie nie możemy statycznie tworzyć klasy najwyższego poziomu (zewnętrznej). tylko klasy zagnieżdżone mogą być statyczne.

Statyczna Klasa zagnieżdżona vs niestatyczna Klasa zagnieżdżona

1) zagnieżdżona Klasa statyczna nie wymaga referencji klasy zewnętrznej, ale Niestatyczna Klasa zagnieżdżona lub klasa wewnętrzna wymaga klasy zewnętrznej Referencja.

2) klasa wewnętrzna (lub niestatyczna Klasa zagnieżdżona) może uzyskać dostęp zarówno do statycznych i niestatycznych członków klasy zewnętrznej. Klasa statyczna nie może uzyskać dostępu nie statyczni Członkowie klasy zewnętrznej. Ma dostęp tylko statyczny Członkowie klasy zewnętrznej.

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

 11
Author: roottraveller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-10 09:19:45

Klasy zewnętrzne nie mogą być statyczne, ale klasy zagnieżdżone/wewnętrzne mogą być. To w zasadzie pomaga używać klasy zagnieżdżonej / wewnętrznej bez tworzenia instancji klasy zewnętrznej.

 9
Author: Saket,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-20 13:36:26

Java posiada statyczne metody powiązane z klasami (np. java.lang.Matematyka ma tylko metody statyczne), ale sama klasa nie jest statyczna.

 1
Author: duffymo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-20 13:35:48