Domanda

Perché non sei in grado di dichiarare una classe come statica in Java?

È stato utile?

Soluzione

classi Solo annidate possono essere statici. In questo modo è possibile utilizzare la classe annidata senza avere un'istanza della classe esterna.

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

Fonti:

Sullo stesso argomento:

Altri suggerimenti

classi di livello superiore sono statici per impostazione predefinita. le classi interne non sono statici per impostazione predefinita. È possibile modificare il valore predefinito per classi interne contrassegnando esplicitamente statica. classi di primo livello, in virtù di essere di alto livello, non possono avere una semantica non statici, perché non ci può essere nessuna classe genitore di riferimento. Pertanto, non v'è alcun modo per modificare il valore predefinito per le classi di livello superiore.

Quindi, sto arrivando in ritardo alla festa, ma ecco i miei due centesimi -. Filosoficamente aggiunta alla risposta di Colin Hebert

A un elevato livello tuoi questione riguarda la differenza tra oggetti e tipi. Mentre ci sono molte auto (oggetti), v'è una sola classe Car (tipo). Dichiarare qualcosa come mezzo statiche che si opera nello spazio "tipo". Ce n'è solo uno. La classe parola di livello superiore definisce già un tipo nello spazio "tipo". Come risultato di "classe public static Car" è ridondante.

Class con il costruttore privato è statico.

Dichiarare la classe in questo modo:

public class eOAuth {

    private eOAuth(){}

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

}

e si può utilizzare senza inizializzazione:

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

Certo che possono, ma solo interno classi nidificate. C'è, significa che le istanze della classe annidata non richiedono un'istanza che racchiude della classe esterna.

Ma per le classi di primo livello, i progettisti di linguaggi non poteva pensare a niente di utile da fare con la parola chiave, quindi non è permesso.

È possibile creare una classe di utilità (che non può avere istanze create) dichiarando un tipo enum con istanze. vale a dire che si sta nello specifico dichiarando che non ci sono casi.

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

... può essere dichiarato statico -. Fintanto che si tratta di una classe di membro

Dalle JLS:

  

classi membro può essere statica, nel qual caso non hanno accesso alle variabili della classe circostante grado; o possono essere classi interne (§8.1.3).

e qui:

  

La parola chiave static può modificare la dichiarazione di un tipo membro C all'interno del corpo di una classe T. non interna Il suo effetto è quello di dichiarare che C non è una classe interna. Proprio come statico metodo di T ha alcuna istanza corrente T nel suo corpo, C ha anche alcuna istanza corrente T, né ha qualsiasi istanza lessicale racchiude.

Una statica parola chiave non avrebbe alcun senso per una classe di livello superiore, solo perché una classe di livello superiore non ha alcun tipo di inclusione.

Come spiegato in precedenza, una classe non può essere statico meno che non sia un membro di un'altra classe.

Se siete alla ricerca per la progettazione di una classe "di cui non ci può essere più istanze", si consiglia di esaminare il modello di progettazione "Singleton".

qui .

Caveat:

  

Se state pensando di utilizzare il   pattern Singleton, resistere con tutti   la tua forza. Si tratta di uno dei più facili   DesignPatterns per capire, probabilmente   il più popolare, e sicuramente il   più abusato.    (fonte: JavaRanch come linkato sopra)

In aggiunta a quanto Java definisce classi interne statiche, c'è un'altra definizione di classi statiche come per il C # mondo [1] . Una classe statica è uno che ha solo metodi statici (funzioni) ed è destinato a supportare la programmazione procedurale. Tali classi non sono realmente le classi in cui l'utente della classe è interessato solo le funzioni di supporto e non a creare istanze della classe. Mentre classi statiche sono supportate in C #, tale sostegno diretto esiste in Java. È comunque possibile utilizzare le enumerazioni per classi statiche mimici C # a Java in modo che un utente non può mai creare istanze di una determinata classe (anche utilizzando la riflessione) [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();
    }
}

Tutto il codice che abbiamo in Java va in una classe. Ogni volta che si corre una classe JVM crea un'istanza di un oggetto. JVM in grado di creare una serie di oggetti, per definizione Static significa avere lo stesso insieme di copia a tutti gli oggetti.

Quindi, se Java avrebbe permesso alla classe superiore per essere statico ogni volta che si esegue un programma che crea un oggetto e mantiene ignorando al stessa posizione di memoria.

Se sono solo sostituendo l'oggetto ogni volta che si esegue che cosa è il punto di crearlo?

In modo che è il motivo per Java è sbarazzato della statica per la top-Livello Classe.

Ci potrebbe essere ragioni più concrete, ma questo aveva un senso molto più logico per me.

Le uniche classi che possono essere statici sono classi interne. Il seguente codice funziona bene:

public class whatever {
    static class innerclass {
    }
}

Il punto di classi interne statiche è che essi non hanno un riferimento all'oggetto classe esterna.

penso che questo sia possibile, come facile come bere un bicchiere di caffè !. Basta dare un'occhiata a questo. Non usiamo parola chiave static in modo esplicito durante la definizione di classe.

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

Non è che una definizione di classe statica? Abbiamo appena utilizzare una funzione rilegata a solo una classe. Fate attenzione che in questo caso possiamo utilizzare un'altra classe in quella annidata. Guardate questa:

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

Si può guardare PlatformUI in Eclipse per una classe con metodi statici e costruttore privato con se stesso di essere finale.

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

se il vantaggio di utilizzare uno statico di classe non era quello di istanziare un oggetto e utilizzando un metodo poi basta dichiarare la classe come pubblico e questo metodo come static.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top