it-swarm.it

Perché una classe di primo livello non può essere statica in Java?

Non riesci a trovare una risposta soddisfacente da nessuna parte.

36
ngesh

Tutte le classi di livello superiore sono, per definizione, statiche.

Ciò a cui static si riduce è che un'istanza della classe può essere indipendente. Oppure, al contrario: una classe interna non statica (= istanza di classe interna) non può esistere senza un'istanza della classe esterna. Poiché una classe di livello superiore non ha una classe esterna, non può essere altro che static.

Poiché le classi all top sono statiche, la parola chiave static in una definizione di classe di livello superiore non ha senso.

Qualche codice per giocare con:

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

Inserisco il "ma non farlo" perché è davvero brutto design del codice. Le classi interne dell'istanza non dovrebbero essere visibili al di fuori della classe esterna. Dovrebbero essere usati solo all'interno della classe esterna.

66
Barend

Ho dato la stessa risposta Perché una classe Java non può essere dichiarata come statica? . Ma scrivendolo di nuovo qui

Dovremmo definire i membri come statici che

  1. Dovrebbe essere comune a tutti gli oggetti della classe.
  2. Dovrebbe appartenere alla classe e accessibile per nome della classe.
  3. Non dovrebbe avere bisogno di un oggetto di classe per accedervi.

Supponiamo ora di definire una classe esterna come statica e supponiamo di poterlo fare. Questo servirà a qualsiasi scopo o fornirà vantaggi a uno sviluppatore o creerà ambiguità e complicazioni sia per gli sviluppatori che per i creatori di linguaggi?

Controlliamo, definendo una classe esterna come statica servirà a scopi che abbiamo definito sopra o no?

  1. Ogni classe è già comune a tutti i suoi oggetti e non è necessario renderla statica per renderla disponibile a tutti i suoi oggetti.
  2. Abbiamo bisogno di un nome di classe per accedere ai suoi membri statici perché questi membri fanno parte della classe mentre una classe esterna fa parte del pacchetto e possiamo accedere direttamente alla classe semplicemente scrivendo nome_pacchetto.class_name (simile a class_name.static_field_name), Quindi di nuovo c'è non c'è bisogno di fare ciò che è già lì per impostazione predefinita.
  3. Non è necessario alcun oggetto per accedere a una classe se è visibile, possiamo semplicemente scrivere nome_pacchetto.class_name per accedervi. E per definizione, una classe è un progetto per i suoi oggetti e creiamo una classe per creare oggetti da essa (l'eccezione sarà sempre presente ad esempio Java.lang.Math), ancora una volta non è necessario definire una classe esterna come statica.

Dai punti precedenti, possiamo dire che i creatori di Java non avevano permesso che una classe esterna fosse statica perché non c'era bisogno di renderla statica. Consentire di rendere statica la classe esterna aumenterà solo le complicazioni, l'ambiguità e la doppiezza. Ulteriori informazioni su Perché una classe Java esterna non può essere statica

3
Naresh Joshi

static può essere aggiunto classi nidificate di un'interfaccia, anche se questa è l'impostazione predefinita.

Credo che static non possa essere aggiunto alle classi di primo livello perché inizialmente non c'erano classi nidificate e non si poteva aggiungere statico a nessuna classe.

Sono state aggiunte classi nidificate successive e statiche possono essere aggiunte alle classi nidificate, tuttavia si tende a non modificare la sintassi più del necessario, in modo che non venga aggiunta alle classi di livello superiore. (come non c'era bisogno/beneficio)

2
Peter Lawrey
  1. Ogni volta che eseguiamo una classe, JVM creerà un oggetto. Tutti gli oggetti statici vengono creati nella memoria statica E non nella memoria heap. Significato, abbiamo la stessa serie di copie su tutti gli oggetti. Quindi, se la prima classe è statica e si esegue pgm, crea un oggetto statico e si mantiene su .__ andando alla stessa memoria statica. che è sbagliato. 

2. Dovremmo definire i membri come statici che Dovrebbe essere comune a tutti gli oggetti della classe . Poiché, ogni classe è già comune a tutti i suoi oggetti e non è necessario creare è statico per essere disponibile per tutti i suoi oggetti. 

0
Anurag Prasad

Beh, immagino tu non capisca correttamente se desideri vedere una parola chiave "statica" in una classe esterna.

In breve, come utilizzerai la funzione di statico in una classe esterna?

public class Outer
{
   public static int x = 0 ; 

}

Ora stai andando a fare Outer.x per accedere alla variabile statica. Ciò implicherebbe che x condivide un singolo valore su tutti gli oggetti di Outer. 

Ora che ce l'abbiamo, di quale conseguenza sarebbe la parola chiave statica nella classe Outer? . 

Non possiamo dichiarare la classe esterna (di primo livello) come statica perché la parola chiave statica è pensata per fornire memoria e logica di esecuzione senza creare oggetti, una classe non ha una logica di valore direttamente, quindi la parola chiave statica non è consentita per la classe esterna.

0
user6674097

Ogni volta che eseguiamo una classe JVM crea un'istanza di un oggetto. JVM può creare un numero di oggetti, per definizione Statico significa che hai lo stesso set di copia su tutti gli oggetti. Quindi, se la top class è statica, ogni volta che esegui un programma crea un oggetto e continua a navigare nella stessa posizione di memoria.

0
salsinga