Perché puoi avere lo stato all'interno di una classe statica in java?

0

Oggi stavo giocando con Java e ho letto sulle classi interne statiche. Perché puoi avere "stato" all'interno di una classe interiore statica. Ad esempio:

class outerClass { 
        static class Test { 
        private String a; 

        String getA() { return a; } 

        void setA( String newA) {a = newA; } 

    }
}

Sto fraintendendo qualcosa? Sembra che tu non debba essere in grado di mantenere lo stato mutabile all'interno di una classe che è etichettata come statica. Inoltre sembra che tu non dovresti essere in grado di creare un'istanza di qualcosa che è una classe statica, dovrebbe essere un singleton statico. Forse qualcuno potrebbe correggermi se sto facendo un'ipotesi errata o chiarirmi perché gli autori di Java hanno deciso di renderlo possibile.

EDIT: mi sembra di confondere la parola chiave final e static in java, poiché le variabili final non hanno stato. Sembra tuttavia molto strano essere in grado di creare un'istanza di una classe statica.

    
posta Chris Stewart 16.07.2014 - 17:39
fonte

4 risposte

4

Una classe interna statica è la stessa di una classe non interna. Il tuo esempio è equivalente a:

class outerClass {}

class Test {
    ...
}

Il static nelle classi interne statiche significa che le istanze della classe interna non sono associate a un'istanza della classe esterna. Senza static , un'istanza di Test è sempre associata a un'istanza di outerClass - dovresti costruire un'istanza di outerClass prima di poter costruire un'istanza di Test e l'istanza di Test avrebbe accesso ai membri di outerClass .

    
risposta data 16.07.2014 - 17:43
fonte
4

static le cose non sono sempre apolidi. Invece, static si riferisce alla possibilità di accedere alle variabili e ai metodi di istanza in un oggetto.

Con classi annidate in Java, il modificatore static sulla classe interna si riferisce al suo accesso alla classe esterna.

Una classe interna static non ha accesso alle variabili di istanza della sua classe di inclusione (proprio come un metodo static non ha accesso alle variabili di istanza). Un'ulteriore implicazione di ciò è che, poiché la classe interna statica non ha la possibilità di accedere alle variabili di istanza, può essere istanziata separatamente dalla classe esterna. Tuttavia, non c'è nulla in questa definizione che implica la mancanza di stato.

Il motivo per usare una classe interna static è di incapsularlo ulteriormente in modo che non possa armeggiare con le sue variabili o metodi esterni ai membri della classe.

Con una modifica successiva e una certa confusione su statico, finale e stato:

I feel as if I am confusing the keyword final and static in java, as final variables do not have state. It still seems very strange to be able to instantiate a static class, though.

Devo sottolineare che anche le variabili finali hanno uno stato. È solo uno stato che può essere assegnato una volta sola. Prendere in considerazione:

final int foo;
if(bar) {
    foo = 42;
} else {
    foo = 4;
}

Codice perfettamente valido e di stato su una variabile finale.

Una classe interna statica che non puoi istanziare è una situazione per la quale non riesco a trovare un caso d'uso. Sì, i progettisti Java hanno utilizzato static in un altro modo (anche importazione, classe, blocco, campo, metodo e classe interna). Ogni diverso uso di static è distinto e dovrebbe essere considerato come concetti separati che a volte interagiscono.

In questo caso, la classe static interna è più simile a un metodo static rispetto a una classe static .

    
risposta data 16.07.2014 - 17:45
fonte
2

Puoi mantenere lo stato statico. È solo associato alla classe, piuttosto che all'istanza dell'oggetto. Quindi ogni istanza di oggetto vede lo stesso valore di stato.

    
risposta data 16.07.2014 - 17:42
fonte
0

La parola chiave "statica" in Java significa solo che gli oggetti di quella classe non sono legati alla classe che li include. Ha niente da fare con metodi e campi statici. Una classe statica è persino più normale di una normale classe nidificata di Java.

Si potrebbe pensare in termini di classe statica C #, che non consente lo stato e contiene solo membri statici. (C # è un po 'più coerente con il termine.) Ho sentito persone, anche quando parlano di Java, fanno riferimento a classi senza stato come "statico", quindi è utile verificare cosa significano le persone quando usano il termine.

Se hai familiarità con C #, tieni presente che, in fondo, Java e C # sono lingue molto diverse, e le loro somiglianze superficiali ti faranno saltare in malo modo se non stai attento.

    
risposta data 16.07.2014 - 20:07
fonte

Leggi altre domande sui tag