Dúvida sobre questão de um livro

2 respostas
rissato
Dado o código:
import java.io.*;

public class TestSer {
  public static 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 + " ");

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

O livro afirma que a saída é: "10 0 10". Minha dúvida é em relação ao fato de que membros static e transient de uma classe não são "serializados". Sendo assim, de onde surgiu o segundo "10" da saída? É impressão ou essa resposta está errada?

2 Respostas

D

Compile o código e você verá que realmente s2.z é 10. Ao incrementar o um atributo estático na linha 1, todas as instâncias pertencentes aquela classe enxergarão o z igual 10, os atributos estáticos são de classe e não de instância. Todos os novos objetos que você crie ou “deserialize” que pertencerem a classe enxergarão o z igual a 10.

Como os atributos estáticos são atributos de classe eles não são serializados, só os atributos das intâncias são serealizados.

Fiz uma adição da linha 2 e uma alteração na linha 3. Espero que isso ajude a você entender o problema.

Espero ter ajudado, se não tiver sido claro é só falar que eu tento explicar de outra forma.

Abraços

import java.io.*;
 
 public class teste {
   public static 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 + " ");     // linha 1
 
       ObjectInputStream is = new ObjectInputStream(
          new FileInputStream("myFile"));
       SpecialSerial s2 = (SpecialSerial)is.readObject();  
       is.close();
       SpecialSerial s3 = new SpecialSerial();  	// linha 2
       System.out.println(s2.y + " " + s2.z + " " + s3.z);  // linha 3
     } catch (Exception x) {System.out.println("exc"); }
   }
 }
 class SpecialSerial implements Serializable {
   transient int y = 7;
   static int z = 9;
 }
rissato

Olá, depois de postar o código aqui no fórum fui rodá-lo e também cheguei a essa conclusão. Me faltou lembrar que membros estáticos não dependem de instâncias. Mesmo assim, muito obrigado pela ajuda! :slight_smile:

Criado 29 de setembro de 2006
Ultima resposta 29 de set. de 2006
Respostas 2
Participantes 2