Statische Klassen in Java

947

Gibt es so etwas wie static classin Java?

Was bedeutet eine solche Klasse? Müssen auch alle Methoden der statischen Klasse vorhanden sein static?

Ist es umgekehrt erforderlich, dass, wenn eine Klasse alle statischen Methoden enthält, die Klasse auch statisch sein soll?

Wofür sind statische Klassen gut?

Krake
quelle
Statische Klassen werden grundsätzlich zum Gruppieren von Klassen verwendet.
RockingDev

Antworten:

847

Java verfügt über statisch verschachtelte Klassen, aber es scheint, als würden Sie nach einer statischen Klasse der obersten Ebene suchen. Java hat keine Möglichkeit, eine Klasse der obersten Ebene statisch zu machen, aber Sie können eine statische Klasse wie folgt simulieren:

  • Klasse deklarieren final- Verhindert die Erweiterung der Klasse, da die Erweiterung einer statischen Klasse keinen Sinn ergibt
  • Konstruktor privateerstellen - Verhindert die Instanziierung durch Clientcode, da es nicht sinnvoll ist, eine statische Klasse zu instanziieren
  • Machen Sie alle , die Mitglieder und die Funktionen der Klasse static- Da die Klasse nicht keine Instanzmethoden aufgerufen werden können instanziiert werden kann oder Instanzfelder zugegriffen
  • Beachten Sie, dass der Compiler Sie nicht daran hindert, ein (nicht statisches) Instanzmitglied zu deklarieren. Das Problem wird nur angezeigt, wenn Sie versuchen, das Instanzmitglied aufzurufen

Einfaches Beispiel für Vorschläge von oben:

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

Was nützen statische Klassen? Eine gute Verwendung einer statischen Klasse besteht darin, einmalige Klassen, Dienstprogramme und / oder Bibliotheksklassen zu definieren, bei denen eine Instanziierung keinen Sinn ergibt. Ein gutes Beispiel ist die Math-Klasse, die einige mathematische Konstanten wie PI und E enthält und einfach mathematische Berechnungen bereitstellt. In einem solchen Fall wäre eine Instanziierung erforderlich und unnötig und verwirrend. Siehe MathKlassen- und Quellcode . Beachten Sie, dass es ist finalund alle seine Mitglieder sind static. Wenn Java die Deklaration von Klassen der obersten Ebene zulässt, ist staticdie Math-Klasse tatsächlich statisch.

Paul Sasik
quelle
35
Eine Klasse Foomit nur staticMethoden ist nicht dasselbe wiestatic class Foo
craigb
12
@Evorlor: Wenn eine Klasse als endgültig deklariert wird, sind ihre Methoden automatisch (effektiv) endgültig. Dies liegt daran, dass eine endgültige Klasse nicht in Unterklassen unterteilt werden kann und daher ihre Methoden nicht überschrieben werden können (dh effektiv endgültig sind). docs.oracle.com/javase/tutorial/java/IandI/final.html
jwayne
30
Diese Antwort befasst sich möglicherweise mit der Bedeutung des OP, erklärt jedoch (derzeit) keine statischen Java-Klassen und beantwortet die Frage daher überhaupt nicht! Dies ist sehr schlecht für Leute, die hierher kommen und versuchen herauszufinden, was eine statische Klasse in Java bedeutet.
Tom
12
@JBoy: In Java gibt es so etwas wie "statische Klasse", worum es in der Frage geht, aber diese Antwort erklärt das überhaupt nicht. Stattdessen wird erklärt, wie in Java simuliert wird, was die Antwort als "statische Klasse" bezeichnet - aber was nicht eine "statische Klasse" in Java ist! (Vielleicht ist es eine "statische Klasse" in einer anderen Sprache (n), aber Leute, die hierher kommen, um etwas über statische Java-Klassen zu lernen, werden irregeführt und verwirrt.)
Tom
4
Sie sollten ausdrücklich erwähnen, dass private MyStaticClass () {// privater Konstruktor myStaticMember = 1; } hat KEINE Auswirkung, da der Konstruktor nicht aufgerufen wird. Aber das ist nicht der Punkt. Ich bin immer noch sehr verwirrt über den Nutzen statischer innerer Klassen in Java und ihren Nutzen oder Mehrwert.
Moldau
315

Nun, Java hat "statisch verschachtelte Klassen", aber sie sind überhaupt nicht mit den statischen Klassen von C # identisch, wenn Sie von dort kommen. Eine statisch verschachtelte Klasse ist nur eine Klasse, die nicht implizit auf eine Instanz der äußeren Klasse verweist.

Statisch verschachtelte Klassen können Instanzmethoden und statische Methoden haben.

In Java gibt es keine statische Klasse der obersten Ebene.

Jon Skeet
quelle
12
In Java Warum erlaubt eine statisch verschachtelte Klasse Instanzmethoden? Was ist die Verwendung einer Instanzmethode in einer solchen Klasse?
Geek
19
@Geek: Hast du meine Antwort gelesen? Lesen Sie den zweiten Satz sorgfältig durch. Warum sollten Sie keine Instanzmethoden für statische Klassen haben wollen? Sie können schließlich Instanzen davon erstellen.
Jon Skeet
17
@Geek: Ja, das ist völlig zulässig. Ihr "Verständnis", dass statische Klassen Dienstprogrammklassen sind, ist im Grunde genommen falsch. Das bedeuten statische Klassen in Java überhaupt nicht.
Jon Skeet
14
@Geek: Ja. Genau wie ich in meiner Antwort schrieb: "Eine statisch verschachtelte Klasse ist nur eine, die nicht implizit auf eine Instanz der äußeren Klasse verweist."
Jon Skeet
6
@ KhurramAli: Meinst du implizit ? Sie sind sicherlich nicht explizit statisch, da Sie das Schlüsselwort staticbeim Deklarieren nicht verwenden . Sie sind implizit statisch, da Sie keinen Verweis auf etwas anderes benötigen, um einen zu erstellen. Persönlich finde ich die statische / nicht statische Terminologie für verschachtelte Klassen sowieso etwas seltsam ... Ich denke, es wäre einfacher, über das Verhalten zu sprechen.
Jon Skeet
157

Es gibt eine statisch verschachtelte Klasse . Diese [statisch verschachtelte] Klasse benötigt keine Instanz der einschließenden Klasse, um selbst instanziiert zu werden.

Diese Klassen [statisch verschachtelte] können nur auf die statischen Elemente der einschließenden Klasse zugreifen [da sie keinen Verweis auf Instanzen der einschließenden Klasse haben ...]

Codebeispiel:

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(); 
  }
}
amit
quelle
1
Können wir also sagen, dass wir innere statische Klassen verwenden können, um sie zu instanziieren, ohne sie öffentlich machen zu müssen?
Moldau
@moldovean Wir verwenden innere statische Klassen, um sie aus einem statischen Kontext (wie main) zu instanziieren . Ich glaube nicht, dass es etwas mit Sichtbarkeit zu tun hat.
Michael Dorst
2
@moldovean statisch / nicht statisch ist orthogonal zur Sichtbarkeit. Sie können jede Art von Sichtbarkeit entweder statisch oder nicht statisch haben. Der Punkt ist, benötigen Sie eine Instanz der einschließenden Klasse, um die innere zu erstellen?
Amit
103

Ja, es gibt eine statisch verschachtelte Klasse in Java. Wenn Sie eine verschachtelte Klasse als statisch deklarieren, wird sie automatisch zu einer eigenständigen Klasse, die instanziiert werden kann, ohne die äußere Klasse instanziieren zu müssen, zu der sie gehört.

Beispiel:

public class A
{

 public static class B
 {
 }
}

Da class Bes als statisch deklariert ist, können Sie explizit instanziieren als:

B b = new B();

Beachten class BSie, dass ein Instanzobjektaufruf folgendermaßen ausgesehen hätte, wenn er nicht als statisch deklariert worden wäre, um ihn eigenständig zu machen:

A a= new A();
B b = a.new B();
Bitmap
quelle
7
Beachten Sie, dass Sie die nicht statische Klasse regelmäßig instanziieren können, B b = new B();wenn Sie versuchen, sie über die Klasse Aselbst zu instanziieren .
Muhammed Refaat
33

Was passiert, wenn ein Mitglied in einem classals static.. deklariert wird ? Auf diese Mitglieder kann zugegriffen werden, ohne das zu instanziieren class. Daher statichat es keine Bedeutung , eine äußere Klasse (Klasse der obersten Ebene) zu bilden . Daher ist es nicht erlaubt.

Sie können jedoch innere Klassen als statisch festlegen (da sie Mitglied der Klasse der obersten Ebene sind). Dann kann auf diese Klasse zugegriffen werden, ohne die Klasse der obersten Ebene zu instanziieren. Betrachten Sie das folgende Beispiel.

public class A {
    public static class B {

    }
}

Innerhalb einer anderen Klasse kann jetzt auf die CKlasse Bzugegriffen werden, ohne eine Instanz der Klasse zu erstellen A.

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

staticKlassen können auch non-staticMitglieder haben. Nur die Klasse wird statisch.

Wenn das staticSchlüsselwort jedoch aus der Klasse entfernt wird B, kann nicht direkt darauf zugegriffen werden, ohne eine Instanz von zu erstellen A.

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

Aber wir können keine staticMitglieder in einer non-staticinneren Klasse haben.

Ramesh-X
quelle
Können wir eine statische Klasse instanziieren oder macht es Sinn?
Supun Wijerathne
6
Nicht wie in anderen Sprachen, statichat nur eine Bedeutung in Java. Wenn sich etwas staticin einer Klasse befindet, bedeutet dies, dass auf dieses Objekt zugegriffen werden kann, ohne diese Klasse zu instanziieren. Es sagt nichts über das Erstellen von Instanzen oder nicht ..
Ramesh-X
Sorry stackoverflow! Ich kann es nicht vermeiden, in diesem Fall Danke zu sagen, Ramesh-X! Sie haben fast alles behandelt, was ich über statische innere Klassen und innere Klassen gewundert habe.
Moldawien
Sie können innere Klassen nicht als statisch festlegen. Dies ist ein Widerspruch . Eine verschachtelte Klasse ist entweder inner oder statisch.
Marquis von Lorne
13

Da dies das Top-Ergebnis bei Google für "statische Klasse Java" ist und die beste Antwort nicht hier ist, dachte ich, ich würde es hinzufügen. Ich interpretiere die Frage von OP in Bezug auf statische Klassen in C #, die in der Java-Welt als Singletons bekannt sind. Für diejenigen, die es nicht wissen, kann in C # das Schlüsselwort "static" auf eine Klassendeklaration angewendet werden, was bedeutet, dass die resultierende Klasse niemals instanziiert werden kann.

Auszug aus "Effective Java - Second Edition" von Joshua Bloch (allgemein als einer der besten verfügbaren Java-Styleguides angesehen):

Ab Version 1.5 gibt es einen dritten Ansatz zur Implementierung von Singletons. Erstellen Sie einfach einen Aufzählungstyp mit einem Element:

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

Dieser Ansatz ist funktional gleichbedeutend mit dem Public-Field-Ansatz, mit der Ausnahme, dass er präziser ist, die Serialisierungsmaschinerie kostenlos zur Verfügung stellt und eine ironclad-Garantie gegen Mehrfachinstanziierung bietet, selbst angesichts ausgefeilter Serialisierungs- oder Reflexionsangriffe. Während dieser Ansatz noch nicht weit verbreitet ist, ist ein Aufzählungstyp mit einem Element der beste Weg, um einen Singleton zu implementieren. (Schwerpunkt Autor)

Bloch, Joshua (2008-05-08). Effektives Java (Java-Serie) (S. 18). Pearson Ausbildung.

Ich denke, die Umsetzung und Begründung sind ziemlich selbsterklärend.

Bennet Huber
quelle
6
Ein guter Weg, um einen Singleton zu implementieren. Leider geht es bei der Frage nicht um Singletons, sondern um statische Klassen
David SN
1
Java hat eine ziemlich einzigartige Interpretation des "statischen" Schlüsselworts. Es sieht so aus, als ob OP von C # kommt, wobei "statische Klasse" einem Singleton in Java entspricht. Ich habe meine Antwort aktualisiert, um diese Interpretation der Frage klar zu machen.
Bennet Huber
1
Die statische AC # -Klasse ist kein Singleton. Eine Singleton-Instanz ist ein Objekt und kann eine Schnittstelle implementieren, was bedeutet, dass sie an der Abhängigkeitsinjektion teilnehmen und verspottet werden kann. Die statische Klasse AC # kann keine Schnittstelle implementieren oder in irgendeiner Weise injiziert werden und ist viel näher an nur einer Reihe von C-Funktionen und erlaubt natürlich Erweiterungsmethoden.
Novaterata
13

Kann eine Klasse in Java statisch sein?

Die Antwort ist JA , wir können eine statische Klasse in Java haben. In Java haben wir statische Instanzvariablen sowie statische Methoden und auch statische Blöcke . Klassen können auch in Java statisch gemacht werden.

In Java können wir die (äußere) Klasse der obersten Ebene nicht statisch machen. Nur verschachtelte Klassen können statisch sein.

statisch verschachtelte Klasse gegen nicht statisch verschachtelte Klasse

1) Für verschachtelte statische Klassen ist keine Referenz der äußeren Klasse erforderlich, für nicht statische verschachtelte Klassen oder innere Klassen ist jedoch eine Referenz für die äußere Klasse erforderlich.

2) Die innere Klasse (oder nicht statische verschachtelte Klasse) kann sowohl auf statische als auch auf nicht statische Mitglieder der äußeren Klasse zugreifen. Eine statische Klasse kann nicht auf nicht statische Mitglieder der Outer-Klasse zugreifen. Es kann nur auf statische Mitglieder der Outer-Klasse zugreifen.

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

Roottraveller
quelle
Auch innere 'nicht statische' Klassen können keine statischen Felder oder Methoden deklarieren
Mr.Cat
8

Äußere Klassen können nicht statisch sein, verschachtelte / innere Klassen jedoch. Das hilft Ihnen im Grunde, die verschachtelte / innere Klasse zu verwenden, ohne eine Instanz der äußeren Klasse zu erstellen.

Saket
quelle
2

In einfachen Worten, Java unterstützt die Deklaration einer Klasse als statisch nur für die inneren Klassen, nicht jedoch für die Klassen der obersten Ebene.

Klassen der obersten Ebene: Ein Java-Projekt kann mehr als eine Klasse der obersten Ebene in jeder Java-Quelldatei enthalten, wobei eine der Klassen nach dem Dateinamen benannt ist. Vor den Klassen der obersten Ebene sind nur drei Optionen oder Schlüsselwörter zulässig: öffentlich, abstrakt und endgültig .

Innere Klassen: Klassen, die sich innerhalb einer Klasse der obersten Ebene befinden, werden als innere Klassen bezeichnet. Dies ist im Grunde das Konzept verschachtelter Klassen. Innere Klassen können statisch sein . Die Idee, die inneren Klassen statisch zu machen, besteht darin, die Objekte der inneren Klassen zu instanziieren, ohne das Objekt der Klasse der obersten Ebene zu instanziieren. Dies ist genau so, wie die statischen Methoden und Variablen innerhalb einer Klasse der obersten Ebene funktionieren.

Daher unterstützt Java statische Klassen auf der Ebene der inneren Klassen (in verschachtelten Klassen).

Und Java unterstützt keine statischen Klassen in Klassen der obersten Ebene.

Ich hoffe, dies gibt eine einfachere Lösung für die Frage nach dem grundlegenden Verständnis der statischen Klassen in Java.

Saichand
quelle
0

Java verfügt über statische Methoden, die Klassen zugeordnet sind (z. B. java.lang.Math verfügt nur über statische Methoden), die Klasse selbst ist jedoch nicht statisch.

Duffymo
quelle
0

Sie können das statische Schlüsselwort nur für eine Klasse verwenden, wenn es sich um eine innere Klasse handelt. Eine statische innere Klasse ist eine verschachtelte Klasse, die ein statisches Mitglied der äußeren Klasse ist. Auf den Zugriff kann zugegriffen werden, ohne die äußere Klasse mithilfe anderer statischer Elemente zu instanziieren. Genau wie statische Elemente hat eine statisch verschachtelte Klasse keinen Zugriff auf die Instanzvariablen und -methoden der äußeren Klasse.

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();
   }
}
Nahid Nisho
quelle
Sie können das staticSchlüsselwort nicht für eine Klasse verwenden, es sei denn, es ist eine verschachtelte Klasse. 'Static Inner' ist ein Widerspruch .
Marquis von Lorne
0

Eine statische Methode bedeutet, dass im Gegensatz zu public auf sie zugegriffen werden kann, ohne ein Objekt der Klasse zu erstellen:

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
  }
}
dJack
quelle
Beantwortet die Frage nicht.
Marquis von Lorne
-1

Alle guten Antworten, aber ich habe keinen Verweis auf java.util.Collections gesehen, der Tonnen statischer innerer Klassen für ihre statischen Faktormethoden verwendet. Also das gleiche hinzufügen.

Hinzufügen eines Beispiels aus java.util.Collections mit mehreren statischen inneren Klassen. Innere Klassen sind nützlich, um Code zu gruppieren, auf den über die äußere Klasse zugegriffen werden muss.

/**
 * @serial include
 */
static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
                             implements Set<E>, Serializable {
    private static final long serialVersionUID = -9215047833775013803L;

    UnmodifiableSet(Set<? extends E> s)     {super(s);}
    public boolean equals(Object o) {return o == this || c.equals(o);}
    public int hashCode()           {return c.hashCode();}
}

Hier ist die statische Faktormethode in der Klasse java.util.Collections

public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
    return new UnmodifiableSet<>(s);
}
Jay Rajput
quelle
Hast du deinen Kommentar nicht bekommen? Können Sie das näher erläutern? Ich versuche Ihren Kommentar zu verstehen.
Jay Rajput