1159 Stimmen

Was ist eine "statische Klasse" in Java?

Gibt es so 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 auch umgekehrt erforderlich? Dass wenn eine Klasse nur statische Methoden enthält, die Klasse auch statisch sein muss?

Wofür sind statische Klassen gut?

6 Stimmen

Sie könnten sich für stackoverflow.com/questions/3584113/java-static-class interessieren.

0 Stimmen

Statische Klassen werden im Grunde verwendet, um Klassen zusammenzufassen.

1 Stimmen

Was meinst du mit "wie static class"?

1021voto

Paul Sasik Punkte 76202

Java hat statische verschachtelte Klassen, aber es hört sich so an, als ob du nach einer statischen Klasse auf oberster Ebene suchst. Java hat keine Möglichkeit, eine Klasse auf oberster Ebene statisch zu machen, aber du kannst eine statische Klasse wie folgt simulieren:

  • Deklariere deine Klasse als final - verhindert die Erweiterung der Klasse, da die Erweiterung einer statischen Klasse keinen Sinn ergibt
  • Mache den Konstruktor private - verhindert die Instanziierung durch Client-Code, da es keinen Sinn macht, eine statische Klasse zu instanziieren
  • Mache alle Elemente und Funktionen der Klasse static - Da die Klasse nicht instanziiert werden kann, können keine Instanzmethoden aufgerufen oder Instanzfelder zugegriffen werden
  • Beachte, dass der Compiler dich nicht daran hindert, eine Instanz (nicht statische) Methode zu deklarieren. Das Problem tritt nur auf, wenn du versuchst, die Instanzmethode aufzurufen

Einfaches Beispiel gemäß obiger Vorschläge:

public class TestMyStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Statischer Wert: " + MyStaticClass.getMyStaticMember());
        System.out.println("Quadrat des Werts: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // führt zu Kompilierungsfehler
     }
}

// Eine Java-Klasse auf oberster Ebene, die das Verhalten einer statischen Klasse imitiert
public final class MyStaticClass {
    private MyStaticClass () { // privater Konstruktor
        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 bringen statische Klassen? Ein guter Einsatzzweck für eine statische Klasse liegt in der Definition von Einmal-, Dienstprogramm- und/oder Bibliotheksklassen, für die eine Instanziierung keinen Sinn ergibt. Ein großartiges Beispiel ist die Math-Klasse, die einige mathematische Konstanten wie PI und E enthält und einfach mathematische Berechnungen bereitstellt. Eine Instanziierung in einem solchen Fall zu verlangen, wäre unnötig und verwirrend. Siehe die Math-Klasse und den Quellcode. Beachte, dass sie final ist und alle ihre Elemente static sind. Wenn Java es erlauben würde, dass auf oberster Ebene deklarierte Klassen als static deklariert werden können, dann wäre die Math-Klasse tatsächlich statisch.

52 Stimmen

Eine Klasse Foo mit nur statischen Methoden ist nicht dasselbe wie statische Klasse Foo

0 Stimmen

Sollten die Methoden auch final sein?

15 Stimmen

@Evorlor: Wenn eine Klasse als final deklariert ist, sind ihre Methoden automatisch (effektiv) final. Dies liegt daran, dass eine finale Klasse nicht abgeleitet werden kann und daher ihre Methoden nicht überschrieben werden können (d. h. sie sind effektiv final). docs.oracle.com/javase/tutorial/java/IandI/final.html

361voto

Jon Skeet Punkte 1325502

Nun, Java hat "statische verschachtelte Klassen", aber sie sind überhaupt nicht dasselbe wie statische Klassen in C#, wenn das dein Ausgangspunkt war. Eine statische verschachtelte Klasse ist einfach eine, die nicht implizit eine Referenz auf eine Instanz der äußeren Klasse hat.

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

Es gibt in Java keine "top-level" statische Klasse.

15 Stimmen

Im Java Warum erlaubt eine statische verschachtelte Klasse Instanzmethoden? Wofür wird eine Instanzmethode in solch einer Klasse verwendet?

21 Stimmen

@Geek: Hast du meine Antwort gelesen? Lies den zweiten Satz sorgfältig. Warum würdest du nicht wollen, Instanzmethoden von statischen Klassen zu haben? Immerhin kannst du Instanzen von ihnen erstellen.

1 Stimmen

Es sei denn ich erhalte die Instanz so Outer.Innner nested = new Outer.Inner(). Aber macht es jetzt Sinn, den Methodenaufruf nested.someInstanceMethod() aus semantischer Sicht zu haben? Dieser Aufruf mag legal sein und durch die Sprache erlaubt werden, aber wenn ich sehe, dass eine Klasse als static deklariert ist, verstehe ich, dass es sich um eine Art Utility-Klasse handelt, die nur aus Verpackungsgründen nicht zu oberster Ebene gemacht wurde. Ich würde gerne Ihre Gedanken dazu verstehen.

190voto

amit Punkte 172586

Es gibt eine statische verschachtelte Klasse, diese [statische verschachtelte] Klasse benötigt keine Instanz der umgebenden Klasse, um selbst instanziiert zu werden.

Diese Klassen [statisch verschachtelte] können nur auf die statischen Elemente der umgebenden Klasse zugreifen [da sie keine Referenz auf Instanzen der umgebenden Klasse haben...]

Codebeispiel:

public class Test { 
  class A { } 
  static class B { }
  public static void main(String[] args) { 
    /*Fehler - Kompilierfehler, Sie benötigen eine Instanz von Test, um A zu instanziieren*/
    A a = new A(); 
    /*wird erfolgreich kompilieren, es ist keine Instanz von Test erforderlich, um B zu instanziieren*/
    B b = new B(); 
  }
}

2 Stimmen

Können wir also sagen, dass wir innere statische Klassen verwenden können, um sie instanzieren zu können, ohne sie öffentlich machen zu müssen?

0 Stimmen

@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.

3 Stimmen

@moldovean statisch/nicht statisch ist unabhängig von der Sichtbarkeit. Sie können jede Art von Sichtbarkeit sowohl bei statischen als auch bei nicht statischen Elementen haben. Die Frage ist, benötigen Sie eine Instanz der umgebenden Klasse, um die innere zu erstellen?

128voto

Bitmap Punkte 11935

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 instanziiert zu haben, zu der sie gehört.

Beispiel:

public class A
{

 public static class B
 {
 }
}

Weil Klasse B als statisch deklariert ist, können Sie explizit instanziieren:

B b = new B();

Beachten Sie, wenn Klasse B nicht als statisch deklariert worden wäre, um sie eigenständig zu machen, hätte ein Instanzaufrufobjekt so ausgesehen:

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

12 Stimmen

Beachten Sie, dass Sie die nicht-statische Klasse auf normale Weise instanziieren können, z. B. B b = new B();, wenn Sie versuchen, sie von der Klasse A selbst zu instanziieren.

44voto

Ramesh-X Punkte 4152

Was passiert, wenn ein Mitglied innerhalb einer class als static deklariert wird..? Diese Mitglieder können ohne Instanziierung der class zugegriffen werden. Daher hat es keine Bedeutung, die äußere Klasse (oberste Ebene) als static zu machen. Daher ist dies nicht erlaubt.

Aber innere Klassen können als statisch festgelegt werden (da sie ein Mitglied der obersten Ebene sind). Dann kann auf diese Klasse zugegriffen werden, ohne die oberste Klasse instanziieren zu müssen. Betrachten Sie das folgende Beispiel.

public class A {
    public static class B {

    }
}

Jetzt kann innerhalb einer anderen Klasse C die Klasse B ohne Instanziierung der Klasse A zugegriffen werden.

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

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

Aber wenn das static Schlüsselwort aus der Klasse B entfernt wird, kann nicht direkt darauf zugegriffen werden, ohne eine Instanz von A zu erstellen.

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

Aber wir können keine static Mitglieder innerhalb einer non-static inneren Klasse haben.

0 Stimmen

Können wir eine statische Klasse instanziieren oder ergibt das überhaupt Sinn?

7 Stimmen

Anders als in anderen Sprachen hat static in Java nur eine Bedeutung. Wenn etwas in einer Klasse static ist, bedeutet das, dass dieses Ding ohne Instanziierung dieser Klasse zugegriffen werden kann. Es sagt nichts darüber aus, ob Instanzen erstellt werden oder nicht.

0 Stimmen

Entschuldigung stackoverflow! Ich kann es nicht vermeiden, Danke Ramesh-X in diesem Fall zu sagen! Sie haben fast alles abgedeckt, was mich über statische innere Klassen und innere Klassen gewundert hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X