Integer x = 400;
Integer y = x; //referencia de x para y é igual a 400
x++; //vai acrescentar 1 para o x , portanto x passa a ser 401
x == y // 401 = 400 ==> false ou não ...
giselezr
mas se y esta apontando para o mesmo lugar na memoria de x, pq quando altero o x não altera o y também?
Arthur_F_Ferreira
giselezr, os wrappers não geram uma referência na memória. Elas apenas “embrulham” os valores primitivos para se comportarem como se fossem objetos. Portanto, quando você faz
Integery=x;
Você copia o valor de x para y que está “embrulhado” como um objeto. Por isso que, ao fazer a comparação de valores, eles são diferentes após o pós-incremento.
giselezr
hum… entendi
obrigada
E
entanglement
Isso se pede em exames de certificação? De qualquer forma, o que está escrito aqui “por debaixo dos panos” é:
e, mais por debaixo dos panos ainda, Integer.valueOf(i) retorna um objeto Integer, obtido de um vetor de Integer criado durante a inicialização do programa, se -128 <= i <= +127, e um novo Integer se o valor for menor que -128 ou maior que +127.
E é por isso que na hora de imprimir os valores de x e y, aparece como 401 e 400 respectivamente, e que x == y imprime “false”.
E
entanglement
Arthur F. Ferreira:
giselezr, os wrappers não geram uma referência na memória. Elas apenas “embrulham” os valores primitivos para se comportarem como se fossem objetos. Portanto, quando você faz
Integery=x;
Você copia o valor de x para y que está “embrulhado” como um objeto. Por isso que, ao fazer a comparação de valores, eles são diferentes após o pós-incremento.
Hum… é mais ou menos isso, mas a explicação ainda não está certa. Como sempre, a realidade é mais complicada que parece
Arthur_F_Ferreira
A grosso modo, é como eu disse. Uma cópia. A grosso modo rs. Eu só não sabia como que o Java fazia isso especificamente por debaixo dos panos.
E
entanglement
Acho que tais questões (que exigem um certo conhecimento do que vai “por debaixo dos panos” para serem corretamente respondidas) não deveriam cair. O problema é que alguns simulados têm tais questões.
rmendes08
Na verdade, os tipos wrappers comportam-se exatamente como quaisquer outros objetos. Ou seja o código abaixo:
Integerx=400;Integery=x;
cria exatamente 1 objeto, e a atribuição y = x faz com que as duas variáveis apontem para exatamente o mesmo objeto na memória.
O truque nessa questão é ter em mente que objetos de tipos wrappers são imutáveis. Ou seja, uma vez que um objeto do tipo Integer encapsula um determinado valor inteiro, ele carregará esse valor por toda a vida; Se por um acaso você somá-lo com algum outro número ou incrementá-lo você vai obter um novo objeto. Sendo assim, no código
Integerx=400;Integery=x;x++
a linha x++ cria um novo objeto, e x passa apontar para esse novo objeto. Por sua vez, y continuará apontando para o antigo valor de x, uma referência para o objeto Integer 400.
Arthur_F_Ferreira
Ah!!! Não imaginava que elas se comportavam como a String!!!
Aleksandro
concordo com as explicações , mas para memorizar isto acho meio simples, pois penso assim:
Objeto imutável é o que não pode sofrer qualquer modificação em seu estado, depois de sua construção. A única forma de modificar um objeto contido por uma variável, é criar um novo e colocar no lugar do velho.
Integer é wrapper (começa com MAIÚSCULO) portanto imutável, até que se crie um novo para colocar no lugar do velho x++; … neste caso a referência foi feita a y pelo valor velho …