Mini-teste: Desmistificando a Certificação SCJP6 Parte X - Parte 6 B

Veja neste artigo uma sequencia de questões bem interessantes.

  1. Com o seguinte código:
    package devmedia; import java.io.File; import java.io.IOException; public class Teste { /** * @param args */ public static void main(String[] args) { try { new File("file.txt").createNewFile(); } catch (IOException e) { e.printStackTrace(); } } }
    O que ocorre?
    1. O coletor de lixo pode entrar em ação para coletar o arquivo.
    2. É criado um arquivo sem uma referência
    3. Não é possível referenciar o arquivo criado
    4. O arquivo não pode ser usado, uma vez que nenhuma referência aponta para ele
    5. É criada uma referência sem arquivo
    6. Essa sintaxe de criação de arquivos não é valida
  2. Dado o seguinte trecho de código:
    Writer wr = new BufferWriter(xxx);
    O que pode ficar no lugar de xxx?
    1. new BufferedWriter(new FileWriter(new File(“arq.txt”)));
    2. new File(“arq.txt”);
    3. new FileWriter(“arq.txt”);
    4. new PrintWriter(new File(“arq.txt”));
    5. new FileReader(“arq.txt”);
  3. Observe:
    package devmedia; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; class Automovel { String marca="DM"; } class Carro extends Automovel implements Serializable{ int numPortas = 5; } public class TesteSerializacao { /** * @param args */ public static void main(String[] args) { Carro c = new Carro(); c.marca="Java"; System.out.print(c.marca); try{ FileOutputStream fos = new FileOutputStream("teste.txt"); ObjectOutputStream os = new ObjectOutputStream(fos); os.writeObject(c); os.close(); FileInputStream fis = new FileInputStream("teste.txt"); ObjectInputStream oi=new ObjectInputStream(fis); c = (Carro)oi.readObject(); oi.close(); }catch (Exception e) { e.printStackTrace(); } System.out.print(c.marca); } }
    Qual é a saída?
    1. Java Java
    2. DM Java
    3. DM DM
    4. Java DM
    5. O código não compila
  4. Dado:
    package devmedia; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class SerializacaoMain { /** * @param args */ public static void main(String[] args) { SerialSpecial sp = new SerialSpecial (); try{ ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("meuArquivo.txt")); os.writeObject(s); os.close(); System.out.print(++s.z+" "); ObjectInputStream is = new ObjectInputStream(new FileInputStream("meuArquivo.txt")); SerialSpecial s2 = (SerialSpecial)is.readObject(); is.close(); System.out.print(s2.y+" "+s2.z); }catch (Exception e) { // TODO: handle exception } } } class SerialSpecial implements Serializable{ transient int y = 7; int z= 9; }
    Quais opções são corretas?
    1. A compilação falha
    2. A saída é: 10 0 10
    3. A saída é: 10 0 9
    4. A saída é: 10 7 9
    5. A saída é: 10 7 10
    6. Para alterar o processo padrão de desserialização, você sobrescreveria o método defaultReadObject(), de Specialserial.
    7. Para alterar o processo padrão de desserialização, você sobrescreveria o método readObject(), de SpecialSerial.
  5. Com o código abaixo:
    package devmedia; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; class Funcionario{ String nome; int idade; Funcionario (){ nome = "Paulo"; idade = 33; } public String toString(){ return nome+ " "+idade+" "; } } class Gerente extends Funcionario implements Serializable{ int departamento; Gerente(){ departamento = 11; } public String toString(){ return super.toString()+departamento; } } public class Principal { /** * @param args */ public static void main(String[] args) { Gerente g = new Gerente(); g.departamento = 21; g.nome="Pedro"; g.idade=45; try{ FileOutputStream fos=new FileOutputStream("teste1.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(g); FileInputStream fis = new FileInputStream("teste1.ser"); ObjectInputStream ois = new ObjectInputStream(fis); Gerente x = (Gerente)ois.readObject(); ois.close(); System.out.println(x); }catch (Exception e) { // TODO: handle exception } } }
    Qual é a saída?
    1. Pedro 45 21
    2. Paulo 33 21
    3. null
    4. O código não compila
    5. É lançada uma exceção

GABARITO COMENTADO

  1. Resposta A, B, C e D

    Realmente, é criado um arquivo físico, porém, como não existe referência a ele, não é possível utilizá-lo. Como há o objeto, mas não há referência a ele, o garbage collector pode agir, uma vez que ele já está marcado para coleta de lixo. A sintaxe é válida, entretanto, para manipular o arquivo dentro do programa, é inútil.

  2. Resposta A, C e D

    O construtor BufferedWriter pode receber qualquer Writer, isso quer dizer quwe, qualquer instância de classe que passe no teste é-um para um Writer. Assim:

    • FileWriter é um Writer (opção C)
    • PrintWriter é um Writer (opção D)
    • É notório ressaltar que um PrintWriter pode receber um File em um dos seus construtores.
    • BufferedWriter é um Writer (opção A)
  3. Resposta D

    Primeiro, perceba que existe uma relação hierárquica entre as classes Carro e Automovel. No processo de desserialização, como Carro não tem diretamente o atributo marca, uma vez que ele é herdado, então no final do processo a marca será DM.

  4. Resposta C e G

    Iniciaremos a explicação pelo atributo com modificador transient. Ele não será levado em consideraçãona serialização. O outro atributo é comum. Entretanto, a modificação é feita depois da serialização e não será levada. Lembre-se de que o estado do objeto precisa ser conservado.

    Para modificar o processo padrão de desserialização, você sobrescreveria o método readObject(), de SerialSpecial.

  5. Resposta B

    Existe uma relação de hierarquia entre as classes. No processo de desserialização, o construtor da classe pai é executado. Desse modo, todos os atributos que forem exclusivos da classe pai serão retornados. O que for da classe filho e tiver sido alterado antes da serialização terá o seu estado mantido.

Em breve daremos continuidade nesta série com mais um artigo.


Leia todos artigos da série

Artigos relacionados