Domanda

Questa domanda ha già una risposta qui:

Qual è la differenza tra classe nidificata statica e non statica?

È stato utile?

Soluzione

Una classe interna, per definizione , non può essere statico , quindi ho intenzione di riformulare la tua domanda come "Qual è la differenza tra le classi annidate statiche e non statici?"

Una classe innestata non statica ha pieno accesso ai membri della classe entro cui è annidato. Una classe innestata statica non ha un riferimento a un'istanza di nidificazione, quindi una classe innestata statica non può richiamare i metodi non statici o accesso campi non statici un'istanza della classe entro cui è annidato.

Altri suggerimenti

Cerchiamo nella fonte della saggezza queste domande: Java efficace di Joshua Bloch:

Tecnicamente non esiste una classe interna statica.Secondo Java efficace, la terminologia corretta è a classe nidificata statica.Una classe annidata non statica è infatti una classe interna, insieme alle classi anonime e alle classi locali.

E ora citiamo:

Ogni istanza di un file non statico nidificato La classe è implicitamente associata a un allegando l'istanza della classe che lo contiene...È possibile invocare metodi sull'istanza di rallentamento.

Una classe nidificata statica non ha accesso all'istanza che la racchiude.Inoltre utilizza meno spazio.

Ci sono due differenze tra classi interne statiche interne e non statici.

  1. In caso di dichiarazione di campi e metodi utente, non statico classe interna non può avere campi e metodi statici. Ma, in caso di classe interna statica, può avere campi statici statici e non e il metodo.

  2. L'istanza di classe interna non statico viene creato con il riferimento dell'oggetto di classe esterna, in cui è definito, questo significa che ha allegando esempio. Ma l'istanza di classe interna statica è creato senza il riferimento della classe esterna, il che significa che fa Non hanno allegando esempio.

Vedere questo esempio

class A
{
    class B
    {
        // static int x; not allowed here
    }

    static class C
    {
        static int x; // allowed here
    }
}

class Test
{
    public static void main(String… str)
    {
        A a = new A();

        // Non-Static Inner Class
        // Requires enclosing instance
        A.B obj1 = a.new B(); 

        // Static Inner Class
        // No need for reference of object to the outer class
        A.C obj2 = new A.C(); 
    }
}
  1. classe interna statica non può accedere ai membri non statici della classe racchiude. Si può accedere direttamente membri statici (campo di istanza e metodi) di racchiudere classe stessa come lo stile procedurale di ottenere valore senza creare oggetti.

  2. classe interna statica può dichiarare entrambi i membri statici e non statici. I metodi statici hanno accesso ai membri statici della classe principale. Tuttavia, non può accedere ai membri non statici della classe interna. Per accedere ai membri della classe interna non statica, deve creare l'oggetto della classe interna non statica.

  3. classe interna non statico non può campo statico e metodi statici dichiarare. Essa deve essere dichiarata in entrambi i tipi di livello statici o superiori. Otterrete questo errore a farlo dicendo "campi statici essere dichiarati solo nei tipi di livello statico o superiore".

  4. non statici classe interna può accedere sia i membri statici e non statici della classe che racchiude in stile procedurale di ottenere il valore, ma non può accedere ai membri della classe interna statica.

  5. La classe di inclusione non può accedere ai membri di classi interne fino a creare un oggetto di classi interne. IF classe principale di accesso membri della classe non statica può creare oggetto della classe interna non statica.

  6. Se la classe principale di accesso ai membri della classe interna statica ha due casi:

    • Caso 1: Per i membri statici, è possibile utilizzare il nome della classe della classe interna static
    • Caso 2:. Per i membri non statici, può creare un'istanza della classe interna static

Discutere annidati classi ...

La differenza è che una dichiarazione di classe nidificata che è statico può essere un'istanza all'esterno della classe contenitrice.

Quando si ha una dichiarazione di classe nidificato che è non è statica , Java non permette di un'istanza se non attraverso classe contenitrice. L'oggetto creato dalla classe interna è collegato all'oggetto creato dalla classe esterno, quindi la classe interna può fare riferimento ai campi della esterno.

Ma se è static , quindi il link non esiste, i campi esterni non è possibile accedere (se non attraverso un riferimento comune come qualsiasi altro oggetto) e, pertanto, è possibile creare un'istanza della classe annidata da sè.

classe interna statica:. Può dichiarare i membri statici statici e non, ma può accedere solo membri statici della sua classe genitori

classe interna non statica:. Può dichiarare solo i membri non statiche, ma può accedere membro statico statico e non della sua classe genitore

Una classe interna non può essere statica, così ho intenzione di riformulare la tua domanda come "Qual è la differenza tra le classi annidate statiche e non statici?".

come u detto qui classe interna non può essere statica ... Ho trovato il codice di sotto della quale viene dato ragione statica ....? o che è corretto ....

Sì, non c'è nulla nella semantica di un tipo annidato statica che avrebbe smesso di farlo. Questo frammento di codice funziona bene.

    public class MultipleInner {
        static class Inner {
        }   
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Inner();
        }
    }
}

Questo è un codice scritto in questo sito ...

per la questione ---> Può un nidificato classe Static essere istanziati più Volte?

risposta è stata --->

Ora, naturalmente il tipo annidato può fare il suo proprio controllo istanza (ad esempio i costruttori privati, pattern Singleton, ecc), ma che non ha nulla a che fare con il fatto che si tratta di un tipo annidato. Inoltre, se il tipo annidato è un enum statica, ovviamente non si può un'istanza affatto.

Ma in generale, sì, un tipo annidato statico può essere un'istanza più volte.

Si noti che tecnicamente, un tipo annidato statico non è di tipo "interno".

Una classe innestata statica interagisce con i membri di istanza della sua classe esterna (e altre classi) come qualsiasi altra classe di primo livello. In effetti, una classe innestata statica è comportamentale una classe di livello superiore che è stato nidificato in un'altra classe di primo livello per il confezionamento di convenienza.

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