Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Nao ficou claro o valor de X e Y pra mim...

Ola

Nao entendi pq X e Y tem o valor 15?


class B {
    int v = 15;
}

class A {
    public static void main(String[] args) {
        B x = new B();   // Cria o objeto x 
        B y = x;                // Cria uma nova referência ao objeto x, não uma cópia

        y.v++;     // Incrementa 1 à variável v (passa a valer 16)
        x.v++;    // Incrementa 1 à variável v (passa a valer 17)
               // Perceba que "x" e "y"são referências do mesmo objeto

        B z = y;  // Cria uma nova referência ao objeto "x"
        z.v--;      // decrementa 1 à variável v (passa a valer 16)

        System.out.println(x.v);
        System.out.println(y.v);
        System.out.println(z.v);
        System.out.println(x.v + y.v + z.v);
    }
}
4 respostas

Olá Everson, tudo bem com você?

Analisando o seu código, linha a linha, seus comentários estão corretos!

É criada uma referência x do tipo B, que inicia com seu atributo x.v valendo 15. Em seguida, é criada uma variável y, e atribuída uma referência para x. Em seguida y.v é acrescida de 1, o que também afeta x.v, pois se tratam da mesma referência. Logo após, x.v é acrescida de 1, que também afeta a outra variável pelo mesmo motivo anterior. Por fim, é criada uma variável z, com a referência para y, ou seja, temos as 3 variáveis apontando para o mesmo objeto na memória, que nesse momento tem o atributo v valendo 17; e finalmente z.v é decrescida de 1, e passa a ser 16.

Sendo assim, a soma das 3, x.v, y.v e z.v pode ser escrita como: 16 + 16 + 16, que tem como resultado o número 48!

Portanto, na verdade X, Y e Z tem o mesmo valor, 16, e não 15!

Em caso de dúvidas, estou à disposição.

Um grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá Arthur,

Desculpa a ignorancia, mas nao consegui entender ainda, teria alguma outra forma de explicacao?

Essas referencias, eu nao consigo entender a logia:

B y = x; // Cria uma nova referência ao objeto x, não uma cópia B z = y; // Cria uma nova referência ao objeto "x"

obrigado Arthur

solução!

Fala Everson!

Não se preocupe, referências podem ser um assunto um tanto quanto confuso no início e é perfeitamente normal não compreender de primeira!

Para exemplificar, vamos pensar em como são armazenados objetos na memória do computador. Quando tratamos de tipos primitivos (int, double, char), ao atribuir uma variável na memória, é como se estivessemos guardando o valor dessas variáveis dentro da própria caixinha dela: quando escrevemos int x = 5, na memória poderia ser representado assim: Imagem de um polígono quadrangular que representa a memória de um computador em fundo neutro com um polígono menor no canto superior esquerdo que representa uma variável x com o valor 5Ou seja, dentro do mesmo espaço de memória é guardada a variável e o valor dela!

Mas quando falamos de variáveis de referências, a representação na memória fica um pouco diferente, pois quando usamos a instrução new Objeto(), estamos criando um espaço na memória que representa um objeto: Imagem de um polígono quadrangular que representa a memória de um computador em fundo neutro com um polígono menor no canto superior esquerdo que representa uma variável x com o valor 5. No canto superior direito há um outro polígono, dentro da memória, que representa o objeto criado a partir do comando `new Objeto()`, com o endereço Objeto@3ab23f

Mas, ao utilizar o comando new Objeto(), sem atribuí-lo a uma referência, esse objeto é criado, armazenado na memória, mas é impossível acessá-lo! É como se estivesse flutuando no vazio. Nesses casos, a Máquina Virtual Java deleta o objeto da memória, pois sabe que ele está ocupando um espaço de memória que não está sendo utilizado. Para acessar esse objeto, então, precisamos atribuir esse espaço de memória a uma variável, com o comando Objeto obj = new Objeto():

Imagem anterior com retângulo centralizado a esquerda que representa uma variável de nome obj, guardada na memória, fazendo referência ao endereço Objeto@3ab23f, através de uma flecha desenhada de obj ao endereço.

Quando utilizamos esse comando, criamos o objeto na memória e um outro espaço, que é a variável obj. Essa variável, como descrito na imagem, aponta para o endereço de memória onde está o objeto criado. A partir desse momento, podemos acessar atributos e métodos do Objeto, a partir de sua referência obj.

Portanto, podemos analisar o comando Objeto obj = new Objeto() em três partes:

  • Objeto obj: essa parte do comando cria na memória a variável de referência obj, sem atribuir nenhum endereço a ela.
  • new Objeto(): essa parte cria o objeto na memória, sem que ele seja atribuído a nenhuma variável
  • Por fim, o operador = de atribuição une as duas partes, e constrói a seta de referência da variável obj para o objeto criado na memória.

Assim, construindo a situação descrita no diagrama.

Beleza, então nós temos agora uma variável obj que aponta para um objeto do tipo Objeto() na memória, a partir do comando Objeto obj = new Objeto(). Mas o que exatamente faz o comando Objeto y = obj?

Bem, nesse caso, a gente conta com a criação da variável de referência (parte anterior ao operador de atribuição), no entanto não criamos o objeto durante essa atribuição, mas sim atribuímos a ele a mesma referência contida na variável obj, ou seja, copiamos para dentro da variável y o endereço de memória Objeto@3ab23f: Imagem anterior com também centralizado a esquerda há um outro retângulo que representa a variável y, guardando o endereço de memória Objeto@3ab23f e apontando para o objeto criado na memória, relação descrita por uma flecha.

Assim, nós temos duas variáveis que apontam para o mesmo objeto. Isso significa que para acessar o objeto guardado na memória no endereço Objeto@3ab23f, podemos utilizar qualquer uma das variáveis: obj ou y. Por se tratar do mesmo objeto, qualquer alteração feita a partir de obj é sentida por y e vice-versa. Isto é, quando alteramos obj, ao acessar y vamos perceber a mudança feita por obj.

Por este motivo, no código de exemplo os valores das variáveis se alteram todos em conjunto: na verdade existe um único objeto, que é referenciado pelas três variáveis.

Em caso de dúvidas, fico à disposição.

Um grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Valeu Arthur, Muitissimo obrigado pela tempo e explicao... Forte Abraço tb