Dúvida sobre objeto e referência

Olá, surgiu uma dúvida sobre objeto e referência, por exemplo, vou criar uma variável e instanciá-la:

Date data = new Date();

Minhas dúvidas são:
O objeto “Date” está alocado na memória em algum local?
A variável “data” está apontando para esse objeto chamado “Date”, logo também possui um espaço na memória?
O valor da data, por exemplo de hoje, dia 01, mês 02, ano 2019, fica guardado na variável “data”? Ou ele aponta para outros locais na memória?

Date não é um objeto, é uma classe e nesse exemplo é o tipo de dado da variável data.

A variável data é a referência para o endereço de memória do objeto da classe Date que você criou ao invocar o construtor com a instrução new Date().
As variáveis de tipo primitivo ocupam um tamanho correspondente ao seu tipo de dado, isto é:

byte    boolean -> 1 byte   ->  8 bits
short   char    -> 2 bytes  -> 16 bits
int     float   -> 4 bytes  -> 32 bits
long    double  -> 8 bytes  -> 64 bits

Já o tamanho reservado para as variáveis de tipo não primitivo (class, interface ou enum) vai depender da implementação da máquina virtual.
Geralmente em máquinas de 32 bits as referências ocupam 32 bits e nas máquinas de 64 bits, ocupam 64 bits.

A classe Date tem um atributo do tipo long que corresponde ao instante de tempo em milissegundos, é esse atributo que de fato contém o valor.
O dia, mês e ano são somente “máscaras” obtidas a partir desse instante de tempo.
A variável data aponta para o objeto do tipo Date que contém esse atributo.

Só para confirmar se entendi:

  1. Date então só definirá quais dados a variável data terá ao ser instanciada.
  2. A variável data é uma forma de eu acessar os dados do objeto Date, sem mexer diretamente no endereço de memória onde as informações estão alocadas.
  3. data então aponta para um endereço na memória que já contém o long. Não aponta para o endereço de memoria onde contém o objeto Date, que por sua vez apontará para esse long, correto?

Obrigado pela resposta, está bem completa, entretanto ainda fico um pouco confuso. É uma daquelas coisas que se me perguntassem não sei se saberia explicar, apesar de lidar com isso dia a dia.

Mais ou menos isso, não só os atributos, mas todos os membros daquela class, interface ou enum.

Isso mesmo.

Não
A variável data aponta para o endereço de memória onde está alocado o objeto do tipo Date, que por sua vez tem o atributo do tipo long.
Por isso que geralmente não chamamos de variável e sim de objeto, pois aquela variável é uma referência (ou um ponteiro) ao objeto que está alocado em algum lugar da memória.

1 curtida

Muito obrigado, cara.
Já tive essa dúvida diversas vezes, agora acredito que vou solidificar.

Tudo de bom!

1 curtida