Warum sind Sie nicht in der Lage, eine Klasse als statisch in Java zu erklären?

StackOverflow https://stackoverflow.com/questions/3584113

  •  01-10-2019
  •  | 
  •  

Frage

Warum sind Sie nicht in der Lage, eine Klasse als statisch in Java zu erklären?

War es hilfreich?

Lösung

Nur verschachtelte Klassen können statisch sein. Damit Sie die verschachtelte Klasse, ohne dass eine Instanz der äußeren Klasse verwenden können.

class OuterClass{
    public static class StaticNestedClass{
    }

    public class InnerClass{
    }

    public InnerClass getAnInnerClass(){
        return new InnerClass();
    }

    //This method doesn't work
    public static InnerClass getAnInnerClassStatically(){
        return new InnerClass();
    }
}

class OtherClass{
    //Use of a static nested class:
    private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();

    //Doesn't work
    private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

    //Use of an inner class:
    private OuterClass outerclass= new OuterClass();
    private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();
    private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();
}

Quellen:

Auf dem gleichen Thema:

Andere Tipps

Top-Level-Klassen sind statisch standardmäßig. Innere Klassen sind nicht statisch standardmäßig. Sie können explizit für innere Klassen die Standardeinstellung ändern, indem sie statische Markierung. Top-Level-Klassen, die aufgrund der obersten Ebene ist, kann nicht nicht-statische Semantik, da kann es keine Elternklasse zu beziehen. Daher gibt es keine Möglichkeit, den Standard für die Top-Level-Klassen zu ändern.

Also, ich komme zu spät zur Party, aber hier ist mein zwei Cent -. Philosophisch Zugabe zu Colin Hebert Antwort

Auf einem hohen Niveau Frage beschäftigt sich mit dem Unterschied zwischen Objekten und Typen. Zwar gibt es viele Autos (Objekte) sind, gibt es nur eine Car-Klasse (Typ). Deklarieren etwas statisch bedeutet, dass Sie in der „Art“ Raum tätig sind. Es gibt nur eins. Die Top-Level-Klasse Schlüsselwort definiert bereits einen Typ in der „Art“ Raum. Als Ergebnis "public static Klasse Car" ist überflüssig.

Klasse mit privatem Konstruktor statisch ist.

Erklären Sie Ihre Klasse wie folgt:

public class eOAuth {

    private eOAuth(){}

    public final static int    ECodeOauthInvalidGrant = 0x1;
    public final static int    ECodeOauthUnknown       = 0x10;
    public static GetSomeStuff(){}

}

und Sie können ohne Initialisierung verwendet:

if (value == eOAuth.ECodeOauthInvalidGrant)
    eOAuth.GetSomeStuff();
...

Sicher können sie, aber nur innere verschachtelte Klassen. Dort bedeutet dies, dass Instanzen der geschachtelten Klasse nicht über eine umgebende Instanz der äußeren Klasse benötigen.

Aber für die Top-Level-Klassen könnten die Sprachdesigner denken an nichts nützlich mit dem Schlüsselwort zu tun, so ist es nicht erlaubt.

Sie können eine Utility-Klasse erstellen (die nicht erstellt Instanzen haben kann) durch einen Aufzählungstyp ohne Instanzen deklarieren. das heißt Sie specificly deklarieren, dass es keine Instanzen sind.

public enum MyUtilities {;
   public static void myMethod();
}
public class Outer {
   public static class Inner {}
}

... kann es statisch deklariert werden. - solange es sich um ein Mitglied der Klasse ist

Von dem JLS:

Mitgliedsklassen können statisch sein, in welchem ??Fall sie keinen Zugriff auf die Instanzvariablen der umgebenden Klasse haben; oder sie können innere Klassen (§8.1.3).

und hier:

Das Schlüsselwort static die Erklärung eines Mitglieds Typ C innerhalb des Körpers eines nicht innere Klasse T. Seine Wirkung ist zu erklären, modifizieren, dass C nicht eine innere Klasse ist. Wie ein statisches Verfahren von T keine aktuellen Instanz von T in seinem Körper hat, C hat auch keine aktuelle Instanz von T, noch hat es keine lexikalisch einschließenden Instanzen haben.

Ein statische Schlüsselwort würde keinen Sinn für eine Top-Level-Klasse machen, weil nur eine Top-Level-Klasse keinen einschließenden Typen hat.

Wie oben erläutert, eine Klasse, die nicht statisch sein kann, wenn es sich um ein Mitglied einer anderen Klasse ist.

Wenn Sie schauen, um eine Klasse zu entwerfen „von denen es nicht mehrere Instanzen sein können“, möchten Sie vielleicht in die „Singleton“ Design-Muster suchen.

Anfänger Singleton info hier .

Caveat:

Wenn Sie mit dem denken Singletonmuster Resist mit allen Ihre Macht. Es ist eine der einfachsten DesignPatterns zu verstehen, wahrscheinlich das populärste, und auf jeden Fall die am meisten missbraucht. (Quelle: JavaRanch wie oben verlinkten)

Zusätzlich zu wie Java definiert statische innere Klassen, gibt es eine andere Definition von statischen Klassen gemäß dem C # world [1] . Eine statische Klasse ist eine, die nur statische Methoden (Funktionen) hat, und es ist zu verstehen prozeduralen Programmierung zu unterstützen. Solche Klassen sind nicht wirklich Klassen, dass der Benutzer der Klasse ist nur in den Hilfsfunktionen interessiert und nicht Instanzen der Klasse zu schaffen. Während statische Klassen in C # unterstützt werden, gibt es keine solche direkte Unterstützung in Java. Sie können jedoch Aufzählungen zu imitieren C # statische Klassen in Java verwenden, so dass ein Benutzer nie Instanzen einer bestimmten Klasse erstellen können (auch mithilfe von Reflektion) [2] :

public enum StaticClass2 {
    // Empty enum trick to avoid instance creation
    ; // this semi-colon is important

    public static boolean isEmpty(final String s) {
        return s == null || s.isEmpty();
    }
}

Alles, was wir Code in Java geht in eine Klasse. Jedes Mal, wenn wir eine Klasse laufen instanziiert JVM ein Objekt. JVM kann eine Anzahl von Objekten erstellen, per definitionem Static bedeutet, dass Sie die gleiche Menge von Kopie auf alle Objekte haben.

Also, wenn Java würde die Spitzenklasse erlaubt hat, statisch zu sein, wenn Sie ein Programm ausführen es ein Objekt erstellt und hält auf den gleichen Speicherplatz zu überschreiben.

Wenn Sie ersetzen nur das Objekt jedes Mal, wenn Sie es laufen was ist der Punkt es schaffen?

So, das ist der Grund, Java wurde der statischen rid für Top-Level-Klasse.

Es könnte konkretere Gründe geben, aber so viele logischen Sinn für mich gemacht.

Die einzigen Klassen, die statisch sind innere Klassen sein können. Der folgende Code funktioniert gut:

public class whatever {
    static class innerclass {
    }
}

Der Punkt der statischen inneren Klassen ist, dass sie nicht über einen Verweis auf die äußere Klassenobjekt.

Ich denke, das möglich ist, so einfach wie ein Glas Kaffee trinken !. Werfen Sie einen Blick auf diese. Wir haben keine statische Schlüsselwort explizit während Klasse definiert wird.

public class StaticClass {

    static private int me = 3;
    public static void printHelloWorld() {
       System.out.println("Hello World");
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

Ist das nicht eine Definition der statischen Klasse? Wir verwenden nur eine Funktion nur eine Klasse binded. Achten Sie darauf, dass wir in diesem Fall eine andere Klasse in dieser verschachtelten verwenden können. Blick auf diese:

class StaticClass1 {

    public static int yum = 4;

    static void  printHowAreYou() {
        System.out.println("How are you?");
    }
}

public class StaticClass {

    static int me = 3; 
    public static void printHelloWorld() {
       System.out.println("Hello World");
       StaticClass1.printHowAreYou();
       System.out.println(StaticClass1.yum);
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

Ein bei PlatformUI in Eclipse für eine Klasse mit statischen Methoden und privaten Konstruktor mit sich selbst zu sein final aussehen kann.

public final class <class name>
{
   //static constants
   //static memebers
}

, wenn der Nutzen einer statische Klasse der Verwendung ist nicht ein Objekt und mit einer Methode instanziiert dann nur die Klasse als öffentlich deklariert und diese Methode als statisch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top