sexta-feira, 22 de maio de 2009

Certificação JAVA: Sobrecarga de construtores


Bom pessoal, hoje vamos começar aqui no blog uma série de posts com dicas para certificação Java SCJP, Certificação com o JLiVe. Como estou começando a estudar para conseguir esta certificação, estes posts vão servir tanto para mim quanto para quem tem o mesmo objetivo.

Vamos então:

Sobre construtores, considere o código abaixo.

1.   public class Teste
2. {
3. public Teste(String str){
4. System.out.println ("Teste(String) executado");
5. }
6. public Teste(Object obj){
7. System.out.println ("Teste(Object) executado");
8. }
9. public Teste(){
10. System.out.println ("Construtor sem argumentos executado");
11. }
12. public static void main(String[] args) {
13. Teste teste = new Teste(null);
14. }
15. }
Qual a opção correta?
  1. chama o construtor public Teste(String str)
  2. chama o construtor public Teste(Object obj)
  3. chama o construtor public Teste()
  4. Código não compila, nenhum construtor adequado definido.
A resposta correta é a número 1. Tanto o construtor que recebe Object e o que recebe uma String são considerados pelo compilador como elegíveis. O null apesar de ser nada... ele está sendo passado como parâmetro, é uma referencia vazia, por tanto o construtor sem parâmetro não é chamado.
Entre o String e o Object o compilador escolhe o mais especifico. Mais o que string tem a ver com null? O null é nada, nada pode ser string ou object (?)... O string é escolhido pois sempre que vc passar uma string você vai poder fazer cast pra object, mas nem todo object vai poder ser uma string.

Dúvidas???
Falei bobagem???

Então entre em contato... através de comentário


abraços.

5 comentários:

  1. Só para complementar o raciocínio de Ian, caso a classe teste possuísse um outro contrutor recebendo Integer, por exemplo:

    public Teste(String string) {
    System.out.println("String");
    }
    public Teste(Integer integer) {
    System.out.println("Integer");
    }

    Neste caso ao chamar o construtor passando null, geraria um erro de compilação porque os 2 construtores são elegíveis e ele não escolhe nenhum, tornando a alternativa 4 correta.

    Ian, vou pegar o embalo nos seus estudos e ver se dessa vez eu consido tirar esta bendita certificação.

    ResponderExcluir
  2. E se eu fizer como o código abaixo?

    new Teste((Object) null);

    Só botando um pouco de lenha na fogueira hehehehe

    ResponderExcluir
  3. Nesse caso eu acho que o construtor que recebe Object é chamado, pois agora você consegue realizar o cast de null para Object sem problema.

    Obs: Eu tive esse problema numa apicação Swing que estou fazendo, onde eu precisava instanciar um JDialog só que eu queria passar null como primeiro parâmetro e true como segundo. Dava erro de compilação porque mais de um contrutor podia ser usado, então fiz o cast para Window: super((Window)null);
    Só funcionou assim...

    ResponderExcluir
  4. Diego e Ian, vcs que já estão no caminho para a certificação, n sei se irei tirar a minha agora tb, mas gostaria de uma indicação de vcs para começar meus estudos e se der tempo daqui até lá, poderei pegar o embalo de vcs e tentar tb.

    ResponderExcluir
  5. pois é fábio costa nesse caso ai ele chama o construtor de object.

    Murilo minha indicação é a seguinte, acompanhe nossos posts sobre certificação ;)

    ResponderExcluir