Dúvida exercício 5 do cap 3 do livro scjp6 Kathy Sierra

8 respostas
S

A questão é a seguinte:

  1. 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?

8 Respostas

davidtiagoconceicao

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

final Fizz f1 = new Fizz();  // 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

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!! :stuck_out_tongue:

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. :smiley:

davidtiagoconceicao

De nada :slight_smile:

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

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…

final Fizz f1 = new Fizz();
f1.x = 7;

pq eu altero um atributo que não é final , porém, isso não é possível…

final Fizz f1 = new Fizz();
Fizz f2 = new Fizz();
f1 = f2;

pq eu altero uma variável que É final

achei muito estranho, mas é importante resaltar para isso :wink:

D
Vc estão com livro em português pq no meu está falatando este metodo:

static Fizz FizzSwitch(Fizz x, Fizz y) {

final Fizz z = x;

z.x = 6;

return z;

}
Nykolas_Lima
<blockquote><div class="quote-author">Daniel.F:</div>Vc estão com livro em português pq no meu está falatando este metodo:

static Fizz FizzSwitch(Fizz x, Fizz y) {

final Fizz z = x;

z.x = 6;

return z;

}

</blockquote>

Daniel, o meu livro tbm é em portugues e está faltando o método FizzSwitch msm…acho que quando traduziram esqueceram de por ¬¬

abraços

Criado 28 de fevereiro de 2009
Ultima resposta 3 de mar. de 2009
Respostas 8
Participantes 6