it-swarm.com.de

Warum kann eine Top-Level-Klasse in Java nicht statisch sein?

Kann nirgendwo eine befriedigende Antwort finden.

36
ngesh

Alle Klassen der obersten Ebene sind definitionsgemäß statisch.

Die Variable static besagt, dass eine Instanz der Klasse für sich alleine stehen kann. Oder andersherum: Eine nicht statische innere Klasse (= innere Instanzklasse) kann nicht ohne eine Instanz der äußeren Klasse existieren. Da eine Klasse der obersten Ebene keine äußere Klasse hat, kann es nur static sein.

Da all Klassen der obersten Ebene statisch sind, ist es sinnlos, das Schlüsselwort static in einer Klassendefinition der obersten Ebene zu haben.

Ein paar Codes zum Spielen:

public class Foo {

    public class Bar {
         // Non-static innner class
    }

    public static class Baz {
         // Static inner class
    }
}

public class Example {
    public static void main(String[] args) {
        new Foo(); // this is ok
        new Foo.Baz(); // this is ok
        new Foo.Bar(); // does not compile!

        Foo f = new Foo();
        Foo.Bar bar = f.new Bar(); //this works, but don't do this
    }
}

Ich füge das "aber mach das nicht" da, weil es wirklich hässlicher Code-Entwurf ist. Instanzinnenklassen sollten außerhalb der Oberklasse nicht sichtbar sein. Sie sollten nur innerhalb der äußeren Klasse verwendet werden.

66
Barend

Ich habe dieselbe Antwort gegeben Warum kann eine Java-Klasse nicht als statisch deklariert werden? . Aber schreibe es noch einmal hier

Wir sollten Mitglieder als statisch definieren

  1. Sollte allen Objekten der Klasse gemeinsam sein.
  2. Sollte zur Klasse gehören und über den Klassennamen erreichbar sein.
  3. Sollte kein Objekt der Klasse benötigen, um darauf zuzugreifen.

Nehmen wir an, wir definieren eine äußere Klasse als statisch und nehmen an, dass wir dies tun dürfen. Wird dies einem Zweck dienen oder einem Entwickler einen Vorteil verschaffen oder wird es für Entwickler und Sprachgestalter zu Mehrdeutigkeiten und Komplikationen führen?

Lassen Sie uns prüfen, ob eine äußere Klasse als statisch definiert wird, dient dem Zweck, den wir oben definiert haben oder nicht.

  1. Jede Klasse ist bereits allen ihren Objekten gemeinsam und muss nicht statisch gemacht werden, um für alle Objekte verfügbar zu werden.
  2. Wir benötigen einen Klassennamen, um auf seine statischen Member zuzugreifen, da diese Member zur Klasse gehören, während eine äußere Klasse zum Package gehört. Wir können direkt auf die Klasse zugreifen, indem Sie einfach package_name.class_name schreiben (ähnlich wie bei class_name.static_field_name) keine Notwendigkeit zu tun, was bereits standardmäßig vorhanden ist.
  3. Wir benötigen kein Objekt, um auf eine Klasse zuzugreifen, wenn sie sichtbar ist. Wir können einfach package_name.class_name schreiben, um darauf zuzugreifen. Definitionsgemäß ist eine Klasse ein Bauplan für ihre Objekte, und wir erstellen eine Klasse, um daraus Objekte zu erstellen (Ausnahme gibt es immer dort, z. B. Java.lang.Math). Es ist auch nicht erforderlich, eine äußere Klasse als statisch zu definieren.

Aus den obigen Punkten können wir sagen, dass Java-Ersteller eine äußere Klasse nicht statisch zugelassen haben, da sie nicht statisch gemacht werden muss. Wenn Sie zulassen, dass die äußere Klasse statisch ist, werden nur Komplikationen, Mehrdeutigkeiten und Duplizierungen erhöht. Lesen Sie mehr über Warum eine äußere Java-Klasse nicht statisch sein kann

3
Naresh Joshi

static kann verschachtelte Klassen einer Schnittstelle hinzugefügt werden, obwohl dies der Standard ist.

Ich glaube, dass static nicht zu Klassen der obersten Ebene hinzugefügt werden kann, da anfangs keine verschachtelten Klassen vorhanden waren und Sie keiner Klasse statisch hinzufügen konnten.

Später wurden verschachtelte Klassen hinzugefügt, und statische Elemente konnten zu verschachtelten Klassen hinzugefügt werden. Es besteht jedoch die Tendenz, die Syntax nicht mehr als nötig zu ändern, sodass sie nicht zu Klassen der obersten Ebene hinzugefügt wurde. (da kein Bedarf/Nutzen bestand)

2
Peter Lawrey
  1. Wann immer wir eine Klasse ausführen, erstellt JVM ein Objekt. Alle statischen Objekte werden in Statischem Speicher und nicht im Heapspeicher erstellt. Das heißt, wir haben für alle Objekte den gleichen Satz von Kopien. Wenn also die oberste Klasse statisch ist und Sie pgm ausführen, erstellt sie ein statisches Objekt und bleibt ___ auf demselben statischen Speicher. was falsch ist. 

2.Wir sollten Mitglieder als statisch definieren, die Sollte allen Objekten der Klasse gemeinsam sein . Jede Klasse ist bereits allen ihren Objekten gemeinsam und es ist nicht erforderlich, Es ist statisch, für alle Objekte verfügbar zu sein. 

0
Anurag Prasad

Nun, ich denke, Sie verstehen nicht richtig, wenn Sie ein "statisches" Schlüsselwort in einer Oberklasse sehen möchten.

Kurz gesagt, wie können Sie die Funktion statisch in einer äußeren Klasse einsetzen?

public class Outer
{
   public static int x = 0 ; 

}

Jetzt machen Sie Outer.x, um auf die statische Variable zuzugreifen. Dies würde bedeuten, dass x einen einzigen Wert für alle Objekte von Outer hat. 

Nun da wir das weg haben, welche Konsequenz würde das statische Schlüsselwort in der Oberklasse haben? . 

Eine äußere Klasse (Top-Level-Klasse) kann nicht als statisch deklariert werden, da das statische Schlüsselwort für die Bereitstellung von Speicher und die Ausführung von Logik vorgesehen ist, ohne dass Objekte erstellt werden. Eine Klasse verfügt nicht direkt über eine Wertelogik. Daher ist das statische Schlüsselwort für die äußere Klasse nicht zulässig.

0
user6674097

Wann immer wir eine Klasse ausführen, instanziiert JVM ein Objekt. JVM kann per Definition eine Reihe von Objekten erstellen. Statisch bedeutet, dass Sie für alle Objekte den gleichen Satz von Kopien verwenden. Wenn also Top-Klasse statisch ist, erstellt das Programm ein Objekt, wenn es ausgeführt wird.

0
salsinga