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

A questão é a seguinte:

[quote]

  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[/quote]

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

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.

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:

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…

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.

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.

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:

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;
}

[quote=Daniel.F]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;
}
[/quote]

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

abraços