Analise atentamente ao trecho de código abaixo e, em seguida, responda ao que é solicitado.
public class Mixer{
Mixer() { }
Mixer(Mixer m) {m1 = m;}
Mixer m1;
public static void main(String[] args){
Mixer m2 = new Mixer();
Mixer m3 = new Mixer(m2);
m3.go();
Mixer m4 = m3.m1;
m4.go();
Mixer m5 = m2.m1;
m5.go();
}
void go() {
System.out.println("hi ");
}
}
Qual o resultado da execução?
hi
Alternativa 2:
hi hi
Alternativa 3:
hi hi hi
Alternativa 4:
hi, seguida de uma exceção.
Alternativa 5:
hi hi, seguida de uma exceção.
Respostas
Resposta:
Alternativa 5
Explicação:
Vamos lá, Guilherme.
Primeiro vamos entender o que o código está fazendo.
Nossa aplicação está toda sendo executa em uma classe Mixer.
- Essa classe possui:
- Um atributo-objeto m1 do tipo Mixer.
- Um construtor sem assinatura, que não faz nada.
- Um construtor com assinatura (recebe um objeto Mixer como parâmetro) e define o valor de m1 sendo igual ao objeto recebido.
- Um método chamado go() que imprime "hi".
- O método estático main()
Quando iniciamos a aplicação ela executa o método main(), que executa as seguintes instruões (seguindo passo a passo por linha a linha):
- Cria um novo objeto m2 do tipo Mixer, e instância ele utilizando o construtor vazio.
- Cria um novo objeto m3 do tipo Mixer, e instância ele utilizando o construtor com assinatura, e passando o objeto m2 como parâmetro.
- Executa o método go() do objeto m3.
- Cria um novo objeto m4 do tipo Mixer e faz referência a ela o atributo-objeto m1 do objeto m3.
- Executa o método go() do objeto m4.
- Cria um novo objeto m5 do tipo Mixer e faz referência a ela o atributo-objeto m1 do objeto m2. (???)
- Executa o método go() do objeto m5.
As instruções são claras e bem defindas, mas o problema está exatamente na 6° instrução. Onde estamos criando o objeto m5 e dizendo que ele faz referencia ao objeto-atributo m1 do objeto m2, sendo que, o objeto-atributo m1 do objeto m2 é NULO, pois em nenhum momento estamos definindo ou alterando seu valor, fazendo assim que retorne uma exceão.
Isso acontece porque quando instânciamos o objeto m2, nós utilizamos o cosntrutor vázio.Caso tivessemos utilizado o construtor com assinatura esse problema não aconteceria, pois ele define o valor de m1.
Resposta:
Alternativa 5:
hi hi, seguida de uma exceção.
Explicação: