2015-08-17 17 views
8
public class Parent { 

public Parent() { 

System.out.println("Parent"); 

    } 
} 


public class Child extends Parent implements Serializable { 


    public Child() { 

     System.out.println("Child"); 
    } 

} 

public class Demote { 

    public static void main(String[] args) { 
     Child c=new Child(); 
     try { 
     FileOutputStream fos=new FileOutputStream 
             ("D:\\DemoFile\\Testword5.txt"); 

     ObjectOutputStream oot=new ObjectOutputStream(fos); 
     oot.writeObject(c); 
     FileInputStream fin=new FileInputStream 
             ("D:\\DemoFile\\Testword5.txt"); 

     ObjectInputStream oin=new ObjectInputStream(fin); 
     oin.readObject(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    }catch (IOException e) { 
     e.printStackTrace(); 
    }catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

L'output di questo codice è - Parent Child Parent.Classe genitore Constructor

Il primo set Parent Child viene chiamato perché viene chiamato il costruttore di argomenti zero. oin.readObject() restituisce un oggetto figlio. Quindi, perché viene chiamato solo il costruttore della classe padre e perché non la classe figlio

+0

Può essere duplicato: http://stackoverflow.com/questions/8141440/how-are-constructors-called-during-serialization-and-deserialization – Rafiq

risposta

2

Il costruttore padre viene chiamato perché non implementa Serializable. The Child tuttavia implementa Serializable per non essere chiamato.

+0

Puoi spiegare perché questo ha senso? Voglio dire, data la domanda che hai detto perché funziona così, ma qual è la ragione alla base di questa decisione di progettazione, perché dovrebbe funzionare in questo modo. Qualche idea? –

+0

@AseemBansal La classe genitore non può sapere che una sottoclasse è stata contrassegnata come serializzabile. Quindi è inizializzato nel modo normale, tramite il costruttore. Tuttavia la sottoclasse sa che il costruttore non ha bisogno di essere chiamato in quanto è serializzabile. –

1

Citando The Java Docs for Serializable:

Per consentire sottotipi di classi non serializzabili da serializzare, il sottotipo può assumersi la responsabilità di salvare e ripristinare lo stato della pubblica del supertipo, protetto, e (se accessibile) pacchetto campi. Il sottotipo può assumere questa responsabilità solo se la classe che estende ha un costruttore no-arg accessibile per inizializzare lo stato della classe. È un errore dichiarare una classe serializzabile se questo non è il caso. L'errore verrà rilevato in fase di esecuzione.

Durante la deserializzazione, i campi delle classi non serializzabili verranno inizializzati utilizzando il costruttore no-arg pubblico o protetto della classe. Un costruttore no-arg deve essere accessibile alla sottoclasse che è serializzabile. I campi delle sottoclassi serializzabili verranno ripristinati dallo stream.

Le classi Serializable non hanno bisogno di un costruttore no-args e non verranno utilizzate per inizializzarle se esistono.

Problemi correlati