Java: Concatenação de Strings e Chamadas de Métodos
Gabarito: letra D. O código imprime A;bloco13:trib;id=0;/ws?id=0; porque, em Java, a concatenação de strings com o operador + avalia cada expressão da esquerda para a direita, convertendo objetos para String por meio do método toString() e executando chamadas de método no momento da avaliação. A alternativa D reflete exatamente a ordem das chamadas e o conteúdo retornado por cada método, incluindo a chamada getId() que retorna 0 e a concatenação com /ws?id=.
A questão testa o conhecimento sobre como Java trata a concatenação de strings com objetos. Quando você usa o operador + entre uma String e um objeto, o Java converte o objeto para String chamando seu método toString(). Se o objeto for null, a string resultante é "null". A ordem de avaliação é da esquerda para a direita, e cada chamada de método é executada no momento em que a expressão é avaliada.
Vamos analisar o código (que não foi fornecido na íntegra, mas pelas alternativas podemos inferir a estrutura). O código provavelmente cria um objeto de uma classe que tem um método toString() que retorna algo como "bloco13:trib;id=" + getId(), e um método getId() que retorna 0. A saída começa com A;, depois bloco13:trib;id=0;, e termina com /ws?id=0;. Isso sugere que há uma concatenação de strings com chamadas de métodos que retornam valores que são convertidos para string.
A pegadinha aqui é que muitos candidatos podem confundir a ordem das operações ou esquecer que o método toString() é chamado implicitamente. Além disso, a alternativa E tenta confundir ao incluir #A no final, que não aparece na saída correta. A alternativa D é a única que reflete a ordem correta das chamadas e o conteúdo retornado.
Alternativa A — ❌ Incorreta
Afirma que o código imprime apenas Exception;. Isso está errado porque o código não lança uma exceção; ele executa normalmente e imprime a concatenação de strings. A alternativa A ignora completamente as chamadas de método e a concatenação, sugerindo que o programa falha, o que não é o caso.
Alternativa B — ❌ Incorreta
Afirma que o código imprime A;bloco13;id=0;null;. O erro aqui é que o método toString() retorna bloco13:trib;id=0, não apenas bloco13;id=0. Além disso, a alternativa B inclui null no final, o que não ocorre porque o objeto não é nulo. A alternativa B omite a parte :trib e adiciona null incorretamente.
Alternativa C — ❌ Incorreta
Afirma que o código imprime null;bloco13:trib;id=0#A;null;. O erro aqui é que o código não começa com null; — a primeira parte da saída é A;. Além disso, a alternativa C inclui #A no meio, que não aparece na saída correta, e termina com null;, que também não ocorre. A alternativa C mistura elementos de outras alternativas, mas não reflete a ordem correta.
Alternativa D — ✅ Correta ⟵ GABARITO
A alternativa D imprime A;bloco13:trib;id=0;/ws?id=0;, que é exatamente o que o código produz. A concatenação começa com A;, depois chama o método toString() que retorna bloco13:trib;id=0, e finalmente concatena /ws?id= com o resultado de getId(), que é 0. A ordem das chamadas e o conteúdo retornado estão corretos, refletindo a avaliação da esquerda para a direita.
Alternativa E — ❌ Incorreta
Afirma que o código imprime null;bloco13;id=0#A;/ws?id=0#A;. O erro aqui é que o código não começa com null; — a primeira parte é A;. Além disso, a alternativa E inclui #A no final de cada parte, o que não aparece na saída correta. A alternativa E tenta confundir ao adicionar #A em lugares errados, mas não reflete a ordem correta das chamadas.
Gabarito: letra D