Questão do dia
A seguinte questão foi tirada do site
The Java Skinny e merece ser analisada:
Given the following code:
import java.util.Date;
public class Example {
public static void main(String args[]) {
Date d1 = new Date (99, 11, 31);
Date d2 = new Date (99, 11, 31);
method(d1, d2);
System.out.println("d1 is " + d1
+ "\nd2 is " + d2);
}
public static void method(Date d1, Date d2) {
d2.setYear (100);
d1 = d2;
}
}
Which one or more of the following correctly describe the
behavior when this program is compiled and run?
a) compilation is successful and the output is:
d1 is Fri December 31 00:00:00 GMT 1999
d2 is Fri December 31 00:00:00 GMT 1999
b) compilation is successful and the output is:
d1 is Fri December 31 00:00:00 GMT 1999
d2 is Sun December 31 00:00:00 GMT 2000
c) compilation is successful and the output is:
d1 is Sun December 31 00:00:00 GMT 2000
d2 is Sun December 31 00:00:00 GMT 2000
d) the assignment 'd1 = d2' is rejected by the
compiler because the Date class cannot overload the operator
'='.
e) the expression (d1 is " + d1 + "\nd2 is " + d2)
is rejected by the compiler because the Date class cannot
overload the operator '+'.
O mais importante na classe Example ocorre no método. O método main apenas inicializa
e cria instâncias de java.util.Date() e imprime os resultados.
- d2 tem o ano setado para 100 (na verdade 2000). Em seguida a data é armazenada em d2.
- Objeto d1 aponta para o mesmo valor de d2. Esta é uma mudança somente na referência, não no que está armazenado em d1.
A classe compila e executa com sucesso, sem erros de
compilação ou execução assim d) é falso. e) é falso porque Java executa
toString() para qualquer objeto utilizado em um contexto de
String. toString() é definido em java.lang.Object logo é herdado
em todas as classes Java. Algumas classes sobrescrevem toString()
para retornar mais informações sobre si mesmas.
A questão se torna, em saber como uma alteração em objeto através de
chamada de método afeta o objeto no método chamador. Isso parece óbvio,
em Java isto pode ser feito, a chamada d2.setYear(100); deve alterar o
conteúdo em d2 e a alteração deve ser visível para o método chamador.
Assim o valor de d2 é alterado. Mas o que acontece quando a referência
ao objeto é alterada em d1 = d2? No método, d1 passa a apontar
para d2. Assim, o valor do ano para d1 é 2000. A atribuição de d1 é local
ao method, quando o método retorna, o valor de d1 é perdido e o
objeto d1 anterior permanece o mesmo.
A resposta é b). a) é falsa porque sabemos
que o conteúdo em d2 foi alterado. c) é falso porque sabemos
que d1 não foi alterado. Os nomes d1 e d2 foram utilizados em main
e method para que fosse mais confuso. Eles são diferentes e são armazenados da pilha em
lugares diferentes. Os objetos declarados são locais a seus métodos.