Exercicio de Passagem de variaveis para métodos.  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
rodolfodev
JavaBaby
[Avatar]

Membro desde: 29/03/2006 16:09:17
Mensagens: 92
Offline

Bom, para o tópico ter mais emoção vou dividi-lo em duas partes.

Tenho dois exercicios que tirei do livro da kathy, vou coloca-los hoje para vcs pensarem e amanhã atarde coloco a minha duvida e a resposta.

Exercicio 1


Exercicio 2
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

O q ta virando isso aqui... É só o q tava faltando... Tópico à prestações...

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
rodolfodev
JavaBaby
[Avatar]

Membro desde: 29/03/2006 16:09:17
Mensagens: 92
Offline

Atendendo a pedidos acho q isso parece meio palhaçada.

Então minha duvida é.

Para mim os dois exercicios deveriam ter comportamento iguais, mais no exercicio 1 todos os arrays tem a mesma referencia de a1 e o resultado é 15 e 15. Já no exercicio 2 os boolean tem a mesma referência mais a respota não é igual b1 é diferente de b2, [resposta false true].

Queria saber se alguem consegue me explicar oq acontece.

Valeu e desculpa pela enrolação é q o resultado eu já sei mais o porque ainda estou me convencendo. rs

Grato,

Rodolfo
diego2005
GUJ Master
[Avatar]

Membro desde: 17/08/2005 10:11:05
Mensagens: 1095
Offline

As variáveis do primeiro exercício são arrays, por isso todos tem a mesma referência, ou seja, o mesmo conteúdo, ele "apontam" endereço na memória (Java is not C++). Já no segunda exercício, as outras variáveis tem apenas uma cópia do valor de b1, e não a mesma referência.

Não sei se fui claro, e nem correto, mas se alguém puder te explicar melhor....


Falow.....T+

SCJP 1.4

Meu Currículo
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

Em java, a passagem de parâmetros é por valor, independentemente se o que é passado para um método é um objeto ou um tipo primitivo.

Quando você passa um tipo primitivo para um método, você está na verdade passando uma cópia do seu valor:



o resultado apresentado será true, pois o método muda(boolean bIn) opera sobre uma cópia do valor passado, e não no valor do atributo passado como parâmetro, ou seja, o valor de bOut não é afetado pela mudança em bIn.

Quando você passa um objeto a um método acontece o mesmo. Você está passando na verdade uma cópia do endereço deste objeto na memória.



como um array é um objeto, quando você passao o array ao método, é passado o endereço do mesmo. Lá dentro do método, a operação ocorre exatamente no objeto array que possui aquele endereço (que nesse ponto possui duas variáveis que apontam para o mesmo endereço, objOut e objIn, logo para o mesmo objeto).

Quando duas variáveis de instância possuem o mesmo endereço, ou seja, apontam para o mesmo objeto, qualquer uma delas pode alterar um valor do objeto. Veja bem, um valor do objeto, não o próprio objeto. O que isso quer dizer?

quer dizer que se no método muda(long[] objIn) a operação fosse essa:



você não teria o objeto objOut alterado para um novo objeto, e sua saída seria 6, pois neste caso o que está sendo feito é atribuir um novo objeto à variável de instância objIn, mas não à variável de instância objOut.

sacou?

ahhh... para exemplificar, me veio a seguinte comparação à mente:

Imagine que você tenha (não me pergunte o por quê) duas pessoas soltando a mesma pipa, ou seja, duas linhas amarradas à mesma pipa.
Se qualquer uma dessas pessoas puxar a pipa para um lado e para o outro, a outra pessoa vai perceber, e vice-versa. Esse seria o caso da mudança no valor, que é percebido pelas duas instâncias.
Agora, se uma das duas, de saco cheio de dividir a mesma pipa, resolve cortar a sua linha e amarrar em outra pipa, a outra pessoa continua com a pipa na linha... enquanto a outra tem sua própria pipa... sacou?

bom, espero ter ajudado a esclarecer!

[]s

Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
rodolfodev
JavaBaby
[Avatar]

Membro desde: 29/03/2006 16:09:17
Mensagens: 92
Offline

no exercicio 2 na linha

boolean b2 = fix(b1);

o b1 é uma copia não uma referência do b1 por isso que b1 continua false?
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

rodolfodev wrote:no exercicio 2 na linha

boolean b2 = fix(b1);

o b1 é uma copia não uma referência do b1 por isso que b1 continua false?


na verdade o que vai "para dentro" do método é que é uma cópia...
então o método trabalha com uma cópia do valor de b1, e te retorna o resultado para b2...

[]'s

Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
rodolfodev
JavaBaby
[Avatar]

Membro desde: 29/03/2006 16:09:17
Mensagens: 92
Offline

Beleza entendi. Vou procurar mais uns exercicios desses, porque apesar de parecer simples esse tipo de exercicio confunde.


Grato,
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team