variable - statische methode java




Statische Klassen in Java (6)

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

Gibt es etwas wie static class in Java?

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

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

Wofür sind statische Klassen gut?


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. Während dieser Ansatz noch weit verbreitet ist, ist ein Single-Element-Enum-Typ der beste Weg, 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.


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

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

B b = new B();

Hinweis: Wenn class B nicht als statisch deklariert wurde, um sie eigenständig zu machen, hätte ein Aufruf eines Instanzobjekts wie folgt ausgesehen:

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

Java hat statisch verschachtelte Klassen, aber es scheint, als ob 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:

  • Declare your class final - Verhindert die Erweiterung der Klasse, da das Erweitern einer statischen Klasse keinen Sinn ergibt
  • Konstruktor private - Verhindert die Instanziierung durch den Client-Code, da es nicht sinnvoll ist, eine statische Klasse zu instanziieren
  • Machen Sie alle Member und Funktionen der Klasse static - Da die Klasse nicht instanziiert werden kann, können keine Instanzmethoden aufgerufen oder Instanzfelder aufgerufen 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.


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.


Was passiert, wenn ein Mitglied in einer class als static deklariert wird? Auf diese Member kann zugegriffen werden, ohne die class zu instanziieren. Daher hat die äußere Klasse (oberste Klasse) 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 kann innerhalb einer anderen Klasse C Klasse B zugegriffen werden, ohne eine Instanz der Klasse A erstellen.

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

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

Wenn jedoch das Schlüsselwort static aus Klasse B , kann nicht direkt darauf zugegriffen werden, ohne eine Instanz von A erstellen.

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

Aber wir können keine static Member in einer non-static inneren Klasse haben.





static-classes