Olá, Amigo! Eu gostaria de falar sobre a estrutura interna das variáveis. Como você já sabe, cada variável está associada a uma área da memória onde seu valor é armazenado. "

"Sim. Você me contou sobre isso da última vez."

"Ótimo. É bom que você se lembre. Vou continuar, então."

"Todos os tipos compostos consistem em outros mais simples. E eles, por sua vez, consistem em outros ainda mais simples. Até que, finalmente, acabamos com tipos primitivos , que não podem ser mais simplificados. É assim que eles são chamados - tipos primitivos . Pois Por exemplo, int é um tipo primitivo, mas String é um tipo composto que armazena seus dados como uma tabela de caracteres (onde cada caractere é um tipo primitivo char )."

"Muito interessante. Continue."

"Tipos compostos são formados pelo agrupamento de tipos simples. Chamamos esses tipos de classes . Quando definimos uma nova classe em um programa, declaramos um novo tipo de dados compostos . Seus dados serão outros tipos compostos ou tipos primitivos."

código Java Descrição
public class Person
{
   String name;
   int age;
}
Um novo tipo composto é declarado – Person.
Seus dados são armazenados na Stringvariável (tipo composto) namee intvariável (tipo primitivo)age
public class Rectangle
{
   int x, y, width, height;
}
Um novo tipo composto é declarado – Rectangle.
Consiste em quatro intvariáveis ​​(tipo primitivo).
public class Cat
{
   Person owner;
   Rectangle territory;
   int age;
   String name;
}
Um novo tipo composto é declarado – Cat. Possui as seguintes variáveis:
owner, tipo composto Person
territory, tipo composto Rectangle
age, tipo primitivo int
name, tipo compostoString

"Por enquanto, tudo está claro, por mais estranho que pareça."

"Grandes tipos (compostos) contêm muitos tipos pequenos (primitivos). É por isso que os objetos desses tipos ocupam muita memória - mais do que as variáveis ​​dos tipos primitivos. Às vezes, muito mais. Executar operações de atribuição com essas variáveis ​​costumava levar muito tempo tempo e exigia a cópia de grandes seções de memória. É por isso que variáveis ​​de tipos compostos não armazenam o objeto em si, mas apenas uma referência a ele, ou seja, seu endereço de quatro bytes. Isso é suficiente para endereçar os dados em tais objetos. A máquina Java lida com todas as complexidades associadas."

"Eu não entendi nada disso."

"Dissemos anteriormente que uma variável é como uma caixa. Se você deseja armazenar o número 13 nela, pode escrever 13 em um pedaço de papel e colocá-lo na caixa."

“Mas imagine que você precise guardar algo maior na caixa (variável). do cachorro em vez do cachorro real, uma placa de carro em vez de um carro de verdade ou o número de telefone do seu vizinho em vez do seu vizinho."

“Pegamos um pedaço de papel e anotamos o telefone do vizinho. para o seu vizinho. Mas, como antes, você ainda tem apenas um vizinho. Isso faz sentido, não é?"

"Uma característica importante de armazenar dados dessa maneira é que você pode ter muitas referências a um único objeto "

"Que interessante! Quase consegui. Diga-me mais uma vez, por favor – o que aconteceria se eu atribuir uma variável de um tipo composto a outra variável do mesmo tipo composto?"

"Assim, as duas variáveis ​​armazenariam o mesmo endereço. Isso significa que, se você alterar os dados do objeto referenciado por uma variável, alterará os dados referenciados pela outra . Ambas as variáveis ​​referenciam o mesmo objeto . Claro, pode haver muitos outras variáveis ​​que também armazenam referências a ela."

"O que as variáveis ​​de tipos compostos (referência/classe) fazem se não estão mantendo uma referência a um objeto? Isso é possível?"

"Sim, amigo. Você está me adiantando com sua pergunta. Isso é possível. Se uma variável do tipo referência (composta) não está armazenando uma referência a um objeto, então ela armazena o que é conhecido como 'nulo referência'. Basicamente, isso significa que ele faz referência a um objeto cujo endereço é 0. No entanto, a máquina Java nunca cria objetos com esse endereço, então ela sempre sabe que se uma variável de referência contém 0, então ela não está apontando para nenhum objeto ."

código Java Descrição
String s;
String s = null;
Declarações equivalentes.
Person person;
person = new Person();
person = null;
Criamos uma variável de pessoa cujo valor é nulo.
Atribuímos a ele o endereço de um objeto Person recém-criado.
Atribuímos null à variável.
Cat cat = new Cat();
cat.owner = new Person();
cat.owner.name = "God";
Criamos um objeto Cat e armazenamos seu endereço na variável cat; cat.owner é igual a nulo.
Definimos cat.owner igual ao endereço de um objeto Person recém-criado.
cat.owner.name ainda é igual a nulo.
Definimos cat.owner.name igual a "Deus"

"Eu entendi corretamente? Variáveis ​​são divididas em dois tipos: tipos primitivos e tipos de referência. Tipos primitivos armazenam valores diretamente, enquanto tipos de referência armazenam uma referência a um objeto. Tipos primitivos incluem int, char, boolean e muitos outros. Referência os tipos incluem todo o resto. Usamos classes para criá-los."

"Você está absolutamente certo, meu garoto."

"Então, você diz que entendeu tudo. Aqui estão algumas tarefas para ajudá-lo a reforçar seu conhecimento."