Os campos, quando existem, podem ser de outros tipos de dados primitivos ou abstratos e os procedimentos, quando também existem, geralmente, realizam operações que manipulam os campos. Considere uma possível estrutura, por ora apenas os campos/atributos, para a classe que representa a data do calendário gregoriano:
public class Data{
private int dia;
private int mes;
private int ano;
...
}
Neste caso, podemos perceber que a classe Data é um tipo de dado abstrato/composto que reúne um conjunto de três campos/atributos denominados neste exemplo de dia, mês e ano. Tendo esse tipo de dado definido, é perfeitamente possível declarar uma referência deste tipo conforme a instrução abaixo:
Nesse caso, o identificador aniversario é denominado de referência uma vez que seu conteúdo é um metadado (endereço de memória). Essa referência é alocada em uma área de memória denominada de stack. Caso o conteúdo do identificador fosse um dado propriamente dito, o mesmo seria denominado de variável e a referida variável poderia ser guardada em outras áreas de memória, inclusive aquelas denominadas de text ou bss, por exemplo. Saiba+
Para compreender mais sobre a divisão de um programa em memória acesse: https://en.wikipedia.org/wiki/Data_segment
X