7
respostas

Refrencia

// MInha dúvida é o seguinte, quando criamos a variável contaDaMarcela estamos referenciado um objeto de memoria dentro da classe Conta Correto? // Outra dúvida é a contaDaMarcela.titular = new Cliente(); o que estamos fazendo é pegar a variável referencia (contaDaMarcela) que foi criada no new Conta(); para apontar uma flecha diretamente na String titular que é referenciada na classe Cliente e aponta também para a classe do newCliente();, ou seja, criamos um novo cliente utilizado mesma referencia sem precisar criar um outra variável só pra cliente, o que acaba fazendo com que o código ficar ainda mais abrangente e mais claro! Esta certo o meu raciocínio? Tive dificuldade de entender essa parte!

public class Conta { 
    double saldo;
    int agencia;
    int numero; 
    Cliente titular;
}
public class TestaContaSemCliente { 

    public static void main(String[] args) { 

        Conta contaDaMarcela = new Conta();
        System.out.println(contaDaMarcela.saldo);

        contaDaMarcela.titular = new Cliente();
        System.out.println(contaDaMarcela.titular);

        contaDaMarcela.titular.nome = "Marcela";
        System.out.println(contaDaMarcela.titular.nome); 
    }
}       
7 respostas

Oi Thais, tudo tranquilo?

Vamos por partes, acredito que analisando uma sentença de cada vez possa ajudar a fazer mais sentido para você, além de me ajudar a organizar minha resposta! :)

Se tiver alguma resposta que não tenha ficado claro é só avisar:

"Minha dúvida é o seguinte, quando criamos a variável contaDaMarcela estamos referenciado um objeto de memoria dentro da classe Conta Correto?"

Correto! Embora eu não diria "dentro" da classe. A classe Conta é um modelo que usamos para criar objetos com o mesmo "formato" na memória.

"Outra dúvida é a contaDaMarcela.titular = new Cliente(); o que estamos fazendo é pegar a variável referencia (contaDaMarcela) que foi criada no new Conta(); para apontar uma flecha diretamente na String titular que é referenciada na classe Cliente e aponta também para a classe do new Cliente();"

Ok, titular é um atributo que pertence à classe Conta e que, portanto, foi criado dentro do objeto contaDaMarcela no momento em que ela foi instanciada na memória: contaDaMarcela = new Conta().

A única coisa que eu apontaria aqui é que titular não é mais uma String, agora ela é uma variável referência que aponta para um objeto do tipo Cliente. Ou seja, dentro dela, encontramos o endereço de memória que aponta para um objeto do tipo Cliente que poderá conter todas as informações da Marcela, como nome, cpf e profissão.

Imgur

Por que eu disse "poderá"? Veja que agora, embora estejamos apontando para o objeto do tipo Cliente, ele ainda está vazio!

Imgur

Portanto precisaremos popular esses atributos. Podemos fazer isso da mesma forma como o Paulo fez na aula, através de comandos como contaDaMarcela.titular.nome = "Marcela":

Imgur

"(...)ou seja, criamos um novo cliente utilizado mesma referencia sem precisar criar um outra variável só pra cliente, o que acaba fazendo com que o código ficar ainda mais abrangente e mais claro!"

Sua conclusão está perfeita! Se pensarmos em como um banco funciona na vida real, uma pessoa não pode ser considerada Cliente de um banco se não tiver uma Conta, correto? Ou melhor, falando de um outra forma que talvez faça mais sentido para o nosso código. Em nosso sistema bancário que estamos desenvolvendo, não existem Clientes que não estejam vinculadas a uma Conta.

Veja que da forma como estávamos instanciando os Clientes no nosso sistema não faz mais tanto sentido. Ao escrevermos Cliente marcela = new Cliente(), estamos criando um Cliente sem vínculo algum, perdido no nosso sistema. Ao contrário de agora, onde para cada Cliente que criarmos, ele precisa ter uma Conta no banco: contaDaMarcela.titular = new Cliente().

Espero ter ajudado a clarear essa parte do conteúdo. É fundamental pegar esses conceitos iniciais para que possamos avançar sem muitos obstáculos no curso. Então se tiver alguma dúvida, avisa aqui no fórum que nós ajudaremos da melhor forma que pudermos!

Bons estudos!!

"Ok, titular é um atributo que pertence à classe Conta e que, portanto, foi criado dentro do objeto contaDaMarcela no momento em que ela foi instanciada na memória: contaDaMarcela = new Conta()."

Essa parte eu entendi!! Porém o que me pegou foi essa logo depois que você respondeu: "A única coisa que eu apontaria aqui é que titular não é mais uma String, agora ela é uma variável referência que aponta para um objeto do tipo Cliente. Ou seja, dentro dela, encontramos o endereço de memória que aponta para um objeto do tipo Cliente que poderá conter todas as informações da Marcela, como nome, CPF e profissão."

A minha duvida é na parte de titular em relação a Cliente no código,em outras palavras eu não conseguir pegar essa parte ah da classe cliente esta pegando a variável titular!!!!

public class Conta { 
    double saldo;
    int agencia;
    int numero; 
    Cliente titular;
}

Se puder me esclarecer essa parte eu agradeço, Thiago :)!

Correto! Embora eu não diria "dentro" da classe. A classe Conta é um modelo que usamos para criar objetos com o mesmo "formato" na memória.

Recapitulando essa parte seria criar uma variável referenciada a um tipo de modelo de classe CONTA,ou seja, você quis dizer que podemos moldar essa classe CONTA independente da criação de variável referenciada que foi apontada! É isso?

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? 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?

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:

Imgur

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:

Imgur

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".

Imgur

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:

Imgur

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:

Imgur

Agora veja que o titular (contaDaMarcela.titular) está apontando para um outro endereço na memória Heap, nesse caso o 0x2f4e29:

Imgur

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!!

Essa parte dentro da memoria de duas áreas internas nunca tinha visto, achei bem interessante de você ter me falado. Embora que não tem visto ainda mais a fundo essa parte de objeto de memoria é um pouco chato mesmo rsrsrs! Podemos trocar via duvidas sobre programação por whastapp?

Oi Thais, esses detalhes realmente são um pouco chatinhos no começo! Mas de qualquer forma, acredito que no momento não seja tão interessante para você se preocupar com esses detalhes. Com tempo e prática as coisas vão se encaixando e fazendo mais sentido! ;)

Sobre as dúvidas, eu acredito fortemente que o fórum ainda seja a sua melhor opção para tirar suas dúvidas. Tanto pelo fato de que seu tópico ficará disponível para outros alunos te ajudarem, como também porque podem haver alunos que poderão se beneficiar com os assuntos que discutimos aqui.

Tendo isso em mente, você também pode me adicionar no LinkedIn. Mas não hesite em continuar buscando ajuda no fórum, aqui você terá acesso a uma quantidade muito maior de pessoas para te dar suporte e eu sempre tento responder as dúvidas daqui o mais breve possível! :D

Obrigado, estava preocupado se esses detalhes era realmente importante, porem como você disse como tempo pego as coias vão se encaixando e fazendo mais sentido! Agradeço mais um vez pela suas respostas! Espero tirar mais duvidas contigo e com outras pessoas no futuro!