Domanda

Mi sto preparando per un esame di certificazione Java e ho visto un codice come questo in uno dei test di pratica:

class Foo {  
    int x = 1;  
    public static void main(String [] args) {  
        int x = 2;  
        Foo f = new Foo();  
        f.whatever();  
    }  
    { x += x; }  // <-- what's up with this?
    void whatever() {  
        ++x;  
        System.out.println(x);  
    }  
}

La mia domanda è ... è valido scrivere codice in parentesi graffe al di fuori di un metodo? Quali sono gli effetti di questi (se presenti)?

È stato utile?

Soluzione

Preso in prestito da qui -

Normalmente, si inserisce il codice per inizializzare una variabile di istanza in un costruttore. Esistono due alternative all'utilizzo di un costruttore per inizializzare le variabili di istanza: blocchi iniziali e metodi finali. I blocchi iniziali per esempio le variabili sembrano proprio blocchi di inizializzatore statico, ma senza la parola chiave statica:

{
    // whatever code is needed for initialization goes here
} 

Il compilatore Java copia l'inizializzatore blocca in ogni costruttore. Pertanto, questo approccio può essere utilizzato per condividere un blocco di codice tra più costruttori.

Potresti anche voler guardare le discussioni qui.

Altri suggerimenti

Questo è un blocco iniziale che viene eseguito mentre l'istanza della classe viene caricata/creata e che viene utilizzata per inizializzare le proprietà dei membri di una classe (vedi Java http://download.oracle.com/javase/tutorial/java/javaoo/initial.html). Puoi avere tutti i blocchi che vuoi e saranno istanziati dall'alto verso il basso.

Oltre al blocco di istanza, puoi avere tutti i blocchi statici che si desidera anche inizializzare i membri statici. Sarebbero stati dichiarati come segue:

public class Initialization {

    static int b = 10;

    int a = 5;

    static {
        b = -9;
    }

    {
        a += 2;
    }

    public static void main(String[] args) throws Exception {

        System.out.println(ClientVoting.b);
        System.out.println(new ClientVoting().a);
        System.out.println(ClientVoting.b);
        System.out.println(new ClientVoting().a);

    }

    static {
        b = 1;
    }

    {
        a++;
    }
}

Mentre la classe viene inizializzata, il membro statico "B" viene inizializzato come 10, quindi il primo ambito statico cambia il suo valore a -9 e successivamente a 1. Questo viene eseguito solo una volta mentre la classe viene caricata. Ciò esegue prima dell'inizializzazione della prima riga del metodo principale.

D'altra parte, l'esempio simile alla tua classe è il riferimento di istanza "A". A viene inizializzato come 5, quindi il blocco di istanza lo aggiorna a 7 e l'ultimo blocco a 8. Come previsto, i membri statici vengono inizializzati solo una volta in questo codice, mentre i blocchi di istanza vengono eseguiti ogni volta che si crea una nuova istanza.

L'output per questo esempio è 1 8 1 8

È un Blocco iniziale. Viene utilizzato per impostare variabili di istanza. La motivazione per utilizzare i blocchi iniziali rispetto ai costruttori è impedire la scrittura di codice ridondante. Il compilatore Java copia il contenuto del blocco in ciascun costruttore.

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