2012-11-11 28 views
7

Dalla guida SCJP 6 di studio - non v'è una domanda per chiedere l'uscita del seguente codice in materia di serializzazione:variabili di classe statiche e serializzazione/deserializzazione

import java.io.*; 

public class TestClass { 
    static public void main(String[] args) { 
    SpecialSerial s = new SpecialSerial(); 
    try { 
     ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("myFile")); 
     os.writeObject(s); 
     os.close(); 
     System.out.print(++s.z + " "); 
     s = null; // makes no difference whether this is here or not 

     ObjectInputStream is = new ObjectInputStream(new FileInputStream("myFile")); 
     SpecialSerial s2 = (SpecialSerial)is.readObject(); 
     is.close(); 
     System.out.println(s2.y + " " + s2.z); 
    } catch (Exception e) {e.printStackTrace();} 
    } 
} 
class SpecialSerial implements Serializable { 
    transient int y = 7; 
    static int z = 9; 
} 

L'output di questo è: 10 0 10

La ragione fornita per questo è che la variabile statica z non è serializzata, cosa che non mi sarei aspettato che fosse.

Il valore della variabile statica int z è incrementato a 10 dopo che l'oggetto è stato scritto nel file, nell'istruzione println().

In questo caso, perché non è tornato al valore originale di 9 quando la classe è deserializzata, o come la classe non viene creata nel modo normale, il valore int predefinito di classe di 0, piuttosto che rimanendo con il suo valore incrementale non predefinito di 10 dopo la deserializzazione? Avrei pensato che il valore di esso sarebbe stato perso, ma non è questo il caso.

Qualcuno fa luce? Sto incespicando da queste parti nell'oscurità oscurando le dita dei piedi su questo ..

risposta

3

Fondamentalmente, le istanze sono serializzate, non classi. Qualsiasi campo statico dichiarato dalla classe non è influenzato dalla serializzazione/deserializzazione di un'istanza della classe. Per da reimpostare su 9, la classe SpecialSerial dovrebbe essere reloaded, che è una questione diversa.

+0

Aaahh .. ah sì, naturalmente - la classe stessa rimane caricata anche se non vi sono istanze di esso. Oh sì - quindi ora ha perfettamente senso. Grazie molto! :-) –

2

Il valore s2.z è il valore di un membro statico z di SpecialSerial classe, ecco perché rimanga 10. z è delimitata dalla classe, e non l'istanza.

E 'come se hai fatto questo

++SpecialSerial.z 
System.out.println(SpecialSerial.z) 

invece di

++s.z 
System.out.println(s2.z) 
+0

Cool - grazie. Ha senso ora. :-) –

Problemi correlati