You are on page 1of 8

1. Saiba tudo sobre controle de acesso para o exame.

Haverá uma boa quantidade de perguntas para as quais você deverá usar o seu conhecimento sobre o assunto. Quando vir uma questão com lógica complexa, certifique-se de olhar os modificadores de acesso primeiro; 2. Procure questões com uma declaração de método que termine com ponto-evírgula em vez de chaves. Se o método estiver em uma classe – e não em uma interface -, então tanto o método como a classe devem ser marcados como abstract; 3. Quando pensar em acesso padrão (default), pense em restrições de pacote, sem exceções. Mas quando pensar em protected, pense em pacote + filhos; 4. Procure por classes concretas que não forneçam implementações para métodos abstratos da superclasse; 5. Enums só podem ser declarados com acesso public ou default, assim como uma classe não interna; 6. As chamadas de métodos polimórficos se aplicam somente a métodos de instâncias; 7. Procure classes que afirmam implementar uma interface, mas não fornecem as implementações de método corretas. A menos que a classe de implementação seja abstract, ela terá que fornecer implementações de todos os métodos definidos na interface; 8. Lembre-se: um método static de uma classe não pode acessar um membro – método ou variável – não estático (de instância) de sua própria classe; 9. Procure perguntas que usem números onde os booleanos seriam obrigatórios. Você pode ver uma avaliação de instrução if que use um número, como na linha a seguir:
1 int x = 1; 2 if (x) { } // Erro do compilador

10. Tome cuidado com variáveis sombreadas e com erros de escopo em blocos de código como switches, try-catches e loops; 11. Lembre-se que quando duas referências apontem para o mesmo objeto, se uma delas for usada para alterá-lo, as duas saberão da alteração, porque ainda haverá somente um objeto. Mas sempre que forem feitas alterações em uma String, a VM atualizará a variável de referência para fazê-la apontar para um objeto diferente. Exemplo:
1 String x = "Pablo"; 2 String y = x; // y e x referenciam o mesmo objeto String 3 4 System.out.println("y = " + y); // Imprime 'Pablo' x = x + " Nóbrega"; // Altera somente x. Foi criado um novo objeto e a referência foi atualizada 6 System.out.println("y = " + y); // Continua imprimindo 'Pablo' 5

A saída para esse código será: y = Pablo y = Pablo

12. No exame será esperado que você saiba, por exemplo, que o código abaixo produz apenas um objeto (o array atribuido a variável de referência inteiros). Nenhum objeto Integer foi realmente criado.
1 Integer[] inteiros = new Integer[5];

13. As variáveis de referência wrapper podem ser null, portanto tome cuidado com algum código que pareça estar realizando operações seguras com primitivos, mas que lançam NullPointerException. Exemplo:
01 class TesteTempo { 02 static Long tempo; 03 04 05 06 07 static void calculaTempo(int parametro) { System.out.println(parametro + 5); }

public static void main(String[] args) { calculaTempo(tempo); // NullPointerException. 'tempo' 08 não foi inicializada 09 10 } }

14. Nenhuma das classes wrapper pode ser ampliada de uma para outra. Por exemplo: Byte não se amplia para Short, Short não se amplia para Long, etc. O código abaixo não vai funcionar:
01 class TesteAmpliacao{ 02 void ampliar(Long parametro) { 03 04 05 06 07 public static void main(String[] args) { TesteAmpliacao teste = new TesteAmpliacao(); teste.ampliar(new Integer(10)); // impossível ampliar de 08 Integer para Long 09 10 } } System.out.println(parametro); }

15. Tenha em mente que uma vez que o coletor de lixo entre em ação, não há garantia de que todos os objetos não utilizados serão realmente removidos da memória; 16. Fique atento! A parte do exame referente aos operadores e atribuições normalmente é aquela em que os candidatos conseguem menos pontos. Por isso, muita atenção nas questões que envolvem esses assuntos; 17. Você deve compreender de forma clara como a concatenação de Strings funciona, principalmente dentro de uma instrução print. Veja o exemplo abaixo:

1 int b = 2; 2 System.out.println("" + b + 3); // Imprime '23' 3 System.out.println(b+3); // Imprime 5

18. Procure questões que usem operadores de incremento e decremento em variáveis final. Obviamente que qualquer tentativa de utilizá-los nessa situação resulta em uma exceção. 19. Os operadores && e || só funcionam com operadores booleanos. Você pode encontrar questões que usem inteiros com esses operadores (dando a impressão que estamos usando o operador bit a bit &). Exemplo:
1 if (5 && 6) // Erro de compilação.

20. Retirando-se uma saída forçada (break, return, System.exit(), etc), as avaliações da expressão de iteração e, posteriormente, da expressão condicional, são sempre as duas últimas coisas a ocorrerem em um loop for. 21. Procure códigos que invoquem métodos que declarem uma exceção, mas o método que estiver chamando não manipule ou declare a exceção verificada. Exemplo abaixo:
void aumenta() { // falta método manipular ou declarar a exceção que deveria ser lançada por realizaCalculo() 2 realizaCalculo(); 1 3} 4 5 void realizaCalculo() { // falta método lançar com throws 6 throw new IOException(); 7}

22. Se você se deparar com a palavra expressão em uma pergunta sobre assertivas e ela não especificar se está se referindo à primeira expressão (teste booleado) ou à segunda (o valor a ser exibido no rastreamento da pilha), então assuma que sempre está se referindo ao teste booleano. 23. Os arrays têm um atributo (não um método) chamado length. É possível que você encontre alguma pergunta que troque o atributo pelo método length(), da classe String, ou vice-versa. Exemplo:
1 String teste = "teste"; 2 System.out.println(teste.length); // Erro de compilação 3}

24. Criar diretórios em Java é diferente de criar arquivos. Ao se construir um Reader ou um Writer, automaticamente um arquivo é criado, caso não exista. Porém o mesmo não ocorre com diretórios, ou seja, o diretório não será criado caso estejamos tentando escrever em um novo arquivo daquele diretório que você deseja que exista. Veja o exemplo abaixo e observe que a linha que cria o diretório está comentada:

1 File diretorio = new File("novoDir"); 2 // diretorio.mkdir(); // Criação de diretório comentada 3 File arquivo = new File(diretorio, "meuArquivo.txt"); arquivo.createNewFile(); // Exceção por conta de o diretório 4 não existir.

25. Você deverá saber quais variáveis são restauradas com os valores apropriados e quais não são, quando um objeto é deserializado. Veja um exemplo:
01 import java.io.*; 02 class SuperClasseNaoSerializada { 03 04 05 public static void main(String[] args) { Leao leao = new Leao(120, "Juba");

System.out.println("antes de deserializar: " + leao.nome + " " + leao.tamanho); 06 try { FileOuputStream fos = new FileOutputStream("arquivo.txt"); 08 ObjectOutputStream oos = new ObjectOutputStream(fos); 07 09 10 11 12 13 try { FileInputStream fis = new FileInputStream("arquivo.txt"); 14 ObjectInputStream ois = new ObjectInputStream (fis); 15 16 17 18 19 20 21 } 22 class Leao extends Animal implements Serializable { 23 24 25 26 27 28 } } String nome; Leao(int t, String n) { tamanho = t; // herdado de Animal nome = n; // não herdado System.out.println("depois de deserializar: " + leao.nome + " " + leao.tamanho); } leao = (Leao) ois.readObject(); ois.close(); } catch (Exception ex) { e.printStackTrace(); } oos.writeObject(leao); oos.close(); } catch (Exception ex) { e.printStackTrace(); }

29 class Animal { 30 int tamanho = 105; 31 }

A saída para esse código será: antes de serializar: Juba 120 depois de deserializar: Juba 105 26. Atenção: a contagem dos meses em um Calendar começa em 0 (zero); 27. Os objetos DateFormat e NumberFormat podem ter os seus locais definidos somente no momento da instanciação. Cuidado com códigos que tentam modificar o local de uma instância existente. Exemplo:
1 class TestaLocal { 2 public static void main(String[] args) { 3 4 5 6} } DateFormat df = DateFormate.getInstance(); df.setLocale(new Locale("it", "IT"));

28. Metacaracteres e Strings não trabalham bem juntos. Portanto, tome cuidado com código como o abaixo, pois ele não compila:
1 class TestaPattern { 2 public static void main(String[] args) { String patternInvalido= "\d"; // Pattern inválido. Não compila. 4 Pattern p = Pattern.compile(patternInvalido); 3 5 6} }

29. Quando encontrar uma sobrescrição de equals(), hashCode() e toString() verifique se não houve uma mudança de visibilidade, pois o método deve ser public. Além disso, observe se não está sendo feita uma sobrecarga, ao invés de sobrescrita. O primeiro código abaixo, por exemplo, é inválido e o segundo é uma sobrecarga válida:
1 class ErroEquals { boolean equals(Object o) { // visibilidade default: não 2 compila 3 4 return false; }

5} 1 class Bola { 2 boolean equals(Bola bola) { // sobrecarga válida 3 4 5} return true; }

30. Na prova, tenha cuidado com a interpretação de certas questões. Não confunda, por exemplo, o uso apropriado ou correto do código de hashing, com a validade ou eficiência da solução implementada;

31. Cuidado para não confundir as classes Collections e Collection. Collection é uma interface com as declarações de métodos comuns a várias coleções e Collections é uma classe com métodos estáticos utilitários; 32. É importante reconhecer o que é interface e o que é classe concreta quando se trata de coleções. O código abaixo não compila porque Map é uma interface:
1 class TestaMap { 2 public static void main(String[] args) { 3 4 5} Map<String, String> mapa } = new Map<String, String>();

33. Entenda o funcionamento das classes Comparator e Comparable, pois elas são bastante parecidas. Analise principalmente a forma como elas trabalham e o método que utilizam para efetuar a comparação; 34. Procure por questões no exame que tentem classificar um array de primitivos usando um Comparator, o que é inválido; 35. Quando houver classificação de um array ou de uma coleção, os elementos contidos nesses objetos devem ser mutuamente comparáveis. Você não pode ter um Object[], colocar dentro dele um objeto Cachorro e um objeto Gato e depois efetuar uma classificação; 36. Os erros mais comuns em busca e classificação são: o Procurar em um array ou coleção que não tenha sido ordenado; o Usar um Comparator ou só na classificação ou só na busca; 37. Quando converter arrays em Collections ou Collections em arrays, lembre-se que a atualização em um dos objetos refletirá no outro. Observe o código abaixo:
01 class TestaColecoes { 02 public static void main(String[] args) { 03 04 05 06 07 08 09 10 11 } } String[] nomes = {"Pablo", "Nóbrega"}; List nomesList = Arrays.asList(nomes); System.out.println("Posição 1 = " + nomesList.get(1)); nomesList.set(1, " - Autor do Post"); for (String s : nomes) { System.out.print(s); }

A saída para esse código será: Posição 1 = Nóbrega Pablo – Autor do Post 38. Certifique-se de que você entende bem a diferença entre “compilação falha”, “compila sem erros”, “compila sem avisos” e “compila com avisos”. Em genéricos e na mistura de código com e sem tipos específicos, os avisos podem fazer diferença;

39. Ao declarar um conjunto não-genérico, o método get() irá retornar Object, portanto é necessário efetuar cast explícito. O código abaixo, por exemplo, não compila:
1 class TestaGenericos { 2 public static void main(String[] args) { 3 4 5 6 7 8} } List teste = new ArrayList(); teste.add(43); int x = teste.get(0); System.out.println(x);

40. Em genéricos, os coringas só podem ser usados para declarações de referências, ou seja, enquanto uma referência pode ser abstrata e polimórfica, o próprio objeto criado deve ser de um tipo específico. Você precisa definir o tipo quando cria o objeto usando new. O exemplo abaixo não é válido:
1 class TestaGenericos { 2 public static void main(String[] args) { 3 4 5} List<?> animais = } new ArrayList<? extends Animal>();

41. Classes internas locais de métodos só podem ser instanciadas dentro do método onde foram criadas e acessam normalmente os membros privados da classe externa, entretanto não poderão usar as variáveis locais do método onde elas estiverem. A única exceção é no caso de as variáveis serem final. Veja o código a seguir:
01 class TestaClasseLocalMetodo { 02 public void fazAlgo() { 03 04 05 int x = 1; class ClasseInvalida {

public void naoRoda() { System.out.println("x = " + x); // não compila. 06 'x' não está visível. Solução: declarar 'x' como final 07 08 09 10 } } } }

42. Em classes internas anônimas, tome cuidado com o ponto-e-vírgula de fechamento da definição da classe. Caso ele não esteja presente, o código não compila. Observe o exemplo:
01 public class Animal { 02 public void pula() {

03 04 05 } 06

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

07 class Cachorro { 08 Animal a = new Animal() { 09 10 11 12 13 } public void pula() { System.out.println("pulo 2"); } } // Não compila. Falta ponto-e-vírgula

43. Saiba identificar uma classe interna anônima que, ao invés de sobrescrever um método da superclasse, define um método novo. 44. Cuidado com instanciação de interface ou classes abstratas. O primeiro código a seguir não roda, mas o segundo sim.
Runnable r = new Runnable(); // Não compila. Tentando instanciar uma interface. Runnable r = new Runnable() { // Compila. Classe anônima. public void run() { } };

45. É muito importante você saber a maneira como uma thread funciona. O exame tem perguntas a respeito de “comportamento garantido” em concorrência que normalmente caem; 46. Atenção com métodos run sobrecarregados. A classe Thread espera um método run() sem argumentos e o executará ao iniciá-la. 47. A classe Thread implementa Runnable, portanto é perfeitamente fazer o seguinte:
1 Thread t = new Thread(new Thread()); 2 t.start();

48. Lembre-se que uma vez uma thread tenha sido iniciada, ela jamais pode ser iniciada novamente; 49. Ao terminar a execução do método sleep(), não significa que a thread retornará ao estado de execução, pois ela fica com o status de executável. O método sleep(), portanto, não deve ser encarado como um timer preciso; 50. Entenda a estrutura dos comandos javac e java. No teste sempre caem perguntas simples do assunto.