Frage Statische Klassen in Java


Gibt es sowas wie? static class in Java?

Was ist die Bedeutung einer solchen Klasse? Müssen alle Methoden der statischen Klasse sein static auch?

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

Wofür sind statische Klassen gut?


764
2017-09-20 13:32


Ursprung


Antworten:


Java ist statisch verschachtelt Klassen, aber es klingt wie 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 diese simulieren:

  • Deklariere deine Klasse final - Verhindert die Erweiterung der Klasse, da das Erweitern einer statischen Klasse keinen Sinn ergibt
  • Mach den Konstruktor private - Verhindert die Instanziierung durch den Client-Code, da es nicht sinnvoll ist, eine statische Klasse zu instanziieren
  • Machen alle die Mitglieder und Funktionen der Klasse static - Da die Klasse nicht instanziiert werden kann, können keine Instanzmethoden aufgerufen oder auf Instanzfelder zugegriffen werden
  • Beachten Sie, dass der Compiler Sie nicht davon abhält, ein Instanzelement (nicht statisch) 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 in der Definition von Einzel-, Dienstprogramm- und / oder Bibliotheksklassen, bei denen 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 liefert. Die Instanziierung in einem solchen Fall wäre unnötig und verwirrend. Siehe Java-Math-Klasse. Beachten Sie, dass es endgültig ist und alle seine Mitglieder statisch sind. Wenn Java die Klassifizierung von Klassen der obersten Ebene zulässt, wäre die Math-Klasse tatsächlich statisch.


710
2017-09-20 13:39



Nun, Java hat "statische verschachtelte Klassen", aber sie sind nicht die gleichen wie die statischen Klassen von C #, wenn Sie von dort kommen. Eine statische 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 auf oberster Ebene.


278
2017-09-20 13:35



Es gibt eine statische geschachtelte KlasseDiese Klasse [static nested] benötigt keine Instanz der umschließenden Klasse, um selbst instanziiert zu werden.

Diese Klassen [statisch verschachtelte Klassen] können nur auf die statischen Member der umschließenden Klasse zugreifen [da sie keinen Verweis auf Instanzen der umschließenden Klasse enthält ...]

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

125
2017-09-20 13:35



Ja, es gibt eine statische 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, zu der sie gehört, instanziieren zu müssen.

Beispiel:

public class A
{

 public static class B
 {
 }
}

weil class B Ist static deklariert, können Sie explizit instanziieren als:

B b = new B();

Beachten Sie, wenn class B wurde nicht als statisch deklariert, um es eigenständig zu machen, hätte ein Aufruf eines Instanzobjekts wie folgt aussehen:

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

83
2017-09-20 13:39



Was passiert, wenn ein Mitglied in einem class wird als deklariert static..? Auf diese Mitglieder kann zugegriffen werden, ohne die class. Daher äußere Klasse (oberste Klasse) static Hat keine Bedeutung. Daher ist es nicht erlaubt.

Sie können jedoch innere Klassen als statisch definieren (da es ein Mitglied der obersten Klassenklasse ist). Dann kann auf diese Klasse zugegriffen werden, ohne die oberste Klassenklasse zu instanziieren. Betrachten Sie das folgende Beispiel.

public class A {
    public static class B {

    }
}

Jetzt in einer anderen Klasse C, Klasse B kann zugegriffen werden, ohne eine Instanz der Klasse zu erstellen A.

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

static Klassen können haben non-static Mitglieder auch. Nur die Klasse wird statisch.

Aber wenn die static Das Schlüsselwort wird aus der Klasse entfernt BEs kann nicht direkt zugegriffen werden, ohne eine Instanz von A.

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

Aber wir können nicht haben static Mitglieder in einem non-static innere Klasse.


28
2017-12-18 06:05



Kann eine Klasse in Java statisch sein?

Die Antwort ist JAkönnen wir statische Klasse in Java haben. In Java haben wir statische Instanzvariablen ebenso gut wie statische Methoden und auch statischer Block. Klassen können auch in Java statisch gemacht werden.

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

Statische geschachtelte Klasse vs. nicht statische geschachtelte Klasse

1) Geschachtelte statische Klasse benötigt keine Referenz der Outer-Klasse, sondern     Nicht-statische geschachtelte Klasse oder innere Klasse erfordert äußere Klasse     Referenz.

2) Innere Klasse (oder nicht-statische geschachtelte Klasse) kann auf beide statisch zugreifen     und nicht-statische Mitglieder der Äußeren Klasse. Eine statische Klasse kann nicht zugreifen     nicht-statische Mitglieder der Äußeren Klasse. Es kann nur auf statisch zugreifen     Mitglieder der Äußeren Klasse.

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


11
2017-10-10 09:19



Da dies das beste Ergebnis bei Google für "static class java" ist und die beste Antwort nicht hier ist, dachte ich, ich würde es hinzufügen. Ich interpretiere OPs Frage nach statischen Klassen in C #, die in der Java-Welt als Singletons bekannt sind. Für diejenigen, die dies 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 Style Guides gilt):

Ab Version 1.5 gibt es einen dritten Ansatz zum Implementieren von Singletons. Erstelle einfach einen Enum-Typ mit einem Element:

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

Dieser Ansatz ist funktional äquivalent zum öffentlichen Feldansatz, abgesehen davon, dass er übersichtlicher ist, die Serialisierungsmaschinerie kostenlos zur Verfügung stellt und eine garantierte Garantie gegen mehrfache Instanziierung bietet, sogar angesichts ausgefeilter Serialisierungs- oder Reflektionsangriffe. Dieser Ansatz muss zwar noch weitgehend übernommen werden, a Single-Element-Enum-Typ ist die beste Möglichkeit, ein Singleton zu implementieren. (Hervorhebungsautor)

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

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


10
2018-02-24 02:37