Dúvida exercício 5 do cap 3 do livro scjp6 Kathy Sierra
8 respostas
S
Slaydy
A questão é a seguinte:
Given:
class Fizz {
int x = 5;
public static void main(String[] args) {
final Fizz f1 = new Fizz();
Fizz f2 = new Fizz();
Fizz f3 = FizzSwitch(f1,f2);
System.out.println((f1 == f3) + " " + (f1.x == f3.x));
}
static Fizz FizzSwitch(Fizz x, Fizz y) {
final Fizz z = x;
z.x = 6;
return z;
} }
What is the result?
A. true true
B. false true
C. true false
D. false false
E. Compilation fails
F. An exception is thrown at runtime
Eu respondi E. Compilation fails, mas a resposta correta segundo o livro é A. true true, quando fui compilar o código realmente não compilou: “cannot assign a value to final variable f1!”. Agora fiquei confusa?! Eu respondi que não compila por que pra mim a passar f1 como argumento na linha: Fizz f3 = FizzSwitch(f1,f2); não é válido. Qual a opinião de vocês?
Olá Slaydy.
Analisei o código e compilei ele aqui. O resultado foi true true, coincidindo com a resposta do livro.
Não entendi muito bem a sua dúvida, a única atribuição de valor para f1 ocorre na linha
finalFizzf1=newFizz();// declara e inicializa f1
A atribuição do resultado do método FizzSwitch é feita para f3 e não para f1. Apenas o valor do atributo x é alterado, o que neste caso é válido.
S
Slaydy
Oi David,
Obrigado vc ajudou mto, eu fiz uma pequena bagunça nos arquivos de códigos fonte aqui e por isso não estava compilando!!
Não sei porque fiquei com dúvida se podia passar a variavel “f1” como parametro pro outro método mas já esclareci a confusão com a sua ajuda.
Obrigada.
davidtiagoconceicao
De nada
A variável final pode ser passada como parâmetro livremente. A única restrição é que a variável declarada não pode ser alterada…
G
guilherme.cq
Uma dúvida!!!
Eu respondei bem rápido essa questão… e errado…
não daria algum erro em relação ao int x não ser estático???
Pois vc esta usando x no método main estatico e ainda no FizzSwitch tb estatico…
Poderiam me esclarecer?
Obrigado.
davidtiagoconceicao
Não por que o int x só é acessado através de uma instância do objeto (z.x), portanto não há problema quanto a int x não ser static.
lipe82
Uma consideração importante a fazer tb é que é possível fazer isso numa boa…
finalFizzf1=newFizz();f1.x=7;
pq eu altero um atributo que não é final , porém, isso não é possível…
finalFizzf1=newFizz();Fizzf2=newFizz();f1=f2;
pq eu altero uma variável que É final
achei muito estranho, mas é importante resaltar para isso