variable - java classes



Chiamare un metodo Java senza nome (6)

Sto guardando il codice qui sotto e ho trovato qualcosa di strano:

public class Sequence {
    Sequence() {
        System.out.print("c ");
    }

    {
        System.out.print("y ");
    }

    public static void main(String[] args) {
        new Sequence().go();
    }

    void go() {
        System.out.print("g ");
    }

    static {
        System.out.print("x ");
    }
}

Mi sarei aspettato che questo desse un errore di compilazione poiché System.out con "y" non appartiene a una dichiarazione di metodo solo un { } . Perché è valido? Non vedo come dovrebbe o dovrebbe essere chiamato questo codice.

Quando viene eseguito questo genera anche xycg , perché lo static { } viene chiamato prima del costruttore della sequenza?


Non è un metodo ma un blocco di inizializzazione .

 {
    System.out.print("y ");
 }

Sarà eseguito prima della chiamata del costruttore. Mentre

static {
        System.out.print("x ");
       }

è un blocco di inizializzazione statico che viene eseguito quando la classe viene caricata dal programma di caricamento classi.

Quindi quando esegui il tuo codice
1. La classe viene caricata dal programma di caricamento classi in modo da eseguire il blocco di inizializzazione statico
Uscita: x è stampato
2. L'oggetto viene creato in modo da eseguire il blocco di inizializzazione e quindi viene chiamato il constuctor
Uscita: y viene stampato seguito da c
3. Viene invocato il metodo principale che a sua volta richiama il metodo go
Uscita: g viene stampato

Risultato finale: xycg
Questo potrebbe aiutare http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/


Questo è un blocco di inizializzazione dell'istanza seguito da un blocco di inizializzazione statico .

{
    System.out.print("y ");
}

viene chiamato quando si crea un'istanza della classe.

static {
    System.out.print("x ");
}

viene chiamato quando la classe viene caricata dal programma di caricamento classi. Quindi quando lo fai

new Sequence().go();

la classe viene caricata, quindi esegue static {} , quindi esegue il blocco di inizializzazione dell'istanza {} , in seguito viene chiamato il corpo del costruttore e quindi il metodo sull'istanza appena creata. Ergo l'output xycg .


Viene utilizzato come blocco di inizializzazione e viene eseguito dopo qualsiasi dichiarazione statica . Potrebbe essere utilizzato per garantire che nessun altro possa creare un'istanza della classe (nello stesso modo in cui si utilizzerà un costruttore privato) come nel modello di progettazione Singleton .


static {
        System.out.print("x ");
    }

È un blocco statico e viene chiamato durante il caricamento della classe

{
    System.out.print("y ");
}

È un blocco di inizializzazione

È possibile avere più blocchi di inizializzazione in una classe, nel qual caso vengono eseguiti nella sequenza in cui compaiono nella classe.

Si noti che qualsiasi blocco di inizializzazione presente nella classe viene eseguito prima del costruttore.


static {
    System.out.print("x ");
}

Static blocks vengono eseguiti una sola volta quando la classe viene caricata e inizializzata da JRE.

E il blocco non-static verrà chiamato ogni volta che si sta creando una nuova istanza e verrà chiamato appena prima del Costruttore.

Come qui hai creato solo 1 istanza di Sequence così costruita è stata chiamata dopo non-static blocchi non-static e quindi il metodo che in realtà è il tuo obiettivo.


{
    System.out.print("y ");
}

Questi tipi di blocchi sono chiamati initializer block . Viene eseguito ogni volta che si crea un'istanza di una class . Al momento della compilazione, questo codice viene spostato in ogni costruttore della classe.

Dove, come nel caso del blocco static initializer : -

static {
    System.out.println("x ");
}

viene eseguito una volta quando viene caricata la classe. Generalmente utilizziamo il blocco di inizializzazione static quando l'inizializzazione di un campo static richiede più passaggi.





initializer