Opa Thais, sem problemas! Essa parte de referência é bem chatinha mesmo de entender! rs
"(...) podemos moldar essa classe CONTA independente da criação de variável referenciada que foi apontada! É isso?
Eu fiquei confuso nessa parte, mas o ponto principal é que uma classe deve ser tratada como uma planta de uma casa, a descrição de como uma casa de verdade deve ser feita. Quando instanciamos um objeto com new Conta
, por exemplo, estamos dizendo que o objeto que será guardado lá na memória do computador foi construído usando as especificações contidas na classe Conta. Como, por exemplo, todo objeto criado a partir da Conta terá um double saldo
, int agencia
, int numero
e um Cliente titular
.
Para explicar as outras dúvidas, eu vou entrar um pouco na parte de como as coisas acontecem por baixo dos panos quando instanciamos um novo objeto na memória, mas sem entrar em muitos detalhes. Vamos então continuar com o exemplo de Conta:
Lá na memória, nós temos duas outras áreas internas: Stack e Heap. A Stack é a área onde são criadas as variáveis que declaramos no nosso programa, então quando declaramos uma variável int x = 20;
. O que acontece por baixo dos panos é a criação dessa variável na Stack:
O Heap, por sua vez, é o local da memória onde criamos os objetos durante a execução do programa. Então quando escrevemos Conta contaDaMarcela = new Conta();
, estamos não só criando a variável contaDaMarcela
como também estamos instanciando um objeto do tipo Conta lá no Heap:
Perceba na imagem acima que dentro da contaDaMarcela
temos apenas o endereço de memória do objeto instanciado. Portanto podemos dizer que a variável contaDaMarcela
está apontando para aquele objeto, ou melhor, ela está referenciando aquele objeto! Mas voltando um pouco para as suas perguntas:
"Outra dúvida, quando coloco pra imprimir no console System.out.println(contaDaMarcela.titular);, ele vai mostrar o objeto de memoria da variável contaDaMarcela que foi apontada (.) pelo atributo titular que foi instanciada no new Cliente; Correto?"
Aqui, como podemos ver na figura acima. O atributo titular
não está sendo apontado e nem está apontando pela variável contaDaMarcela
, já que ele mesmo é parte do próprio objeto. A minha recomendação é que você leia o ponto ( . ) como "acessa". Então contaDaMarcela.titular
poderia também ser lido como "titular da conta da Marcela" ou "contaDaMarcela acessa titular".
O que realmente acontece com titular
, é que ao instanciarmos um novo Cliente fazendo contaDaMarcela.titular = new Cliente();
, estamos fazendo com que ele passe a referenciar um novo objeto Cliente na memória Heap:
Prontinho, nosso Cliente está pronto para ser modificado. Mas veja também que a única forma de acessarmos os atributos do Cliente é através do atributo titular
que pertence ao objeto referenciado pela contaDaMarcela
. Portanto se formos seguir o caminho para o objeto de Cliente como mostra a figura, temos primeiro que acessar a contaDaMarcela
para só depois acessar o objeto que está sendo referenciado pelo titular
. Como já vimos anteriormente, fazemos isso através do contaDaMarcela.titular.nome = "Marcela";
por exemplo.
"Se eu fazer a impressão no console só com a variável contaDaMarcela ele vai mostrar o objeto de memoria, portanto tanto contaDaMarcela quanto contaDaMarcela.titular vai estar apontando para o mesmo objeto de memoria que foi instanciado o objeto! Ficou certo o raciocínio?"
Pode ser que essa pergunta tenha sido respondida com a imagem anterior, mas só para revisar... vimos que contaDaMarcela
aponta para um objeto com um determinado endereço, nesse caso o 0x100483
:
Agora veja que o titular (contaDaMarcela.titular
) está apontando para um outro endereço na memória Heap, nesse caso o 0x2f4e29
:
Então como podemos ver, contaDaMarcela
e contaDaMarcela.titular
apontam para lugares diferentes. Embora, a sua conclusão tenha um fundo de verdade, já que para acessarmos o endereço que está dentro de contaDaMarcela.titular
precisamos antes acessar o endereço de contaDaMarcela
.
Acho que é isso, então pode respirar fundo agora! :D
Mesma coisa de antes, se ficou alguma dúvida é só avisar aqui que eu farei o possível para te ajudar até esclarecer todas as suas dúvidas!
Bons estudos!!