¡Hola, amigo! Me gustaría hablarles sobre la estructura interna de las variables. Como ya sabes, cada variable está asociada a un área de memoria donde se almacena su valor. "

"Sí. Me hablaste de eso la última vez".

"Genial. Es bueno que lo recuerdes. Continuaré, entonces".

"Todos los tipos compuestos consisten en otros más simples. Y ellos, a su vez, consisten en otros aún más simples. Hasta que, por fin, terminamos con tipos primitivos , que no se pueden simplificar más. Así es como se llaman: tipos primitivos . Por ejemplo, int es un tipo primitivo, pero String es un tipo compuesto que almacena sus datos como una tabla de caracteres (donde cada carácter es un tipo primitivo char )".

"Muy interesante. Adelante".

"Los tipos compuestos se forman agrupando los simples. A estos tipos los llamamos clases . Cuando definimos una nueva clase en un programa, declaramos un nuevo tipo de datos compuestos . Sus datos serán otros tipos compuestos o tipos primitivos".

codigo Java Descripción
public class Person
{
   String name;
   int age;
}
Se declara un nuevo tipo compuesto: Person.
Sus datos se almacenan en la Stringvariable (tipo compuesto) namey intla variable (tipo primitivo)age
public class Rectangle
{
   int x, y, width, height;
}
Se declara un nuevo tipo compuesto: Rectangle.
Consta de cuatro intvariables (de tipo primitivo).
public class Cat
{
   Person owner;
   Rectangle territory;
   int age;
   String name;
}
Se declara un nuevo tipo compuesto: Cat. Tiene las siguientes variables:
owner, tipo compuesto Person
territory, tipo compuesto Rectangle
age, tipo primitivo int
name, tipo compuestoString

"Por ahora, todo está claro, por extraño que parezca".

"Los tipos grandes (compuestos) contienen muchos tipos pequeños (primitivos). Es por eso que los objetos de estos tipos ocupan mucha memoria, más que las variables de los tipos primitivos. A veces mucho más. Realizar operaciones de asignación con tales variables solía llevar mucho tiempo". tiempo y requirió la copia de grandes secciones de memoria. Es por eso que las variables de tipos compuestos no almacenan el objeto en sí, sino solo una referencia a él, es decir, su dirección de cuatro bytes. Esto es suficiente para direccionar los datos en tales objetos. La máquina Java maneja todas las complejidades asociadas".

"No entendí nada de eso".

"Dijimos anteriormente que una variable es como una caja. Si quieres guardar el número 13 en ella, puedes escribir 13 en una hoja de papel y ponerlo en la caja".

"Pero imagina que necesitas guardar algo más grande en la caja (variable). Por ejemplo, un perro, un automóvil o tu vecino. En lugar de tratar de empujar lo que no se puede empujar dentro de la caja, podrías hacer algo más fácil: usar una foto del perro en lugar del perro real, una matrícula en lugar de un auto real, o el número de teléfono de su vecino en lugar de su vecino".

“Tomamos un papel y escribimos el número de teléfono del vecino. Esto es como una referencia a un objeto. Si copiamos el papel con el número de teléfono del vecino y lo ponemos en varias casillas, ahora hay más referencias. a tu vecino. Pero, como antes, todavía tienes un solo vecino. Eso tiene sentido, ¿no?

"Una característica importante de almacenar datos de esta manera es que puede tener muchas referencias a un solo objeto "

"¡Qué interesante! Ya casi lo tengo. Dígame una vez más, por favor, ¿qué pasaría si asigno una variable de un tipo compuesto a otra variable del mismo tipo compuesto?"

"Entonces, las dos variables almacenarían la misma dirección. Eso significa que si cambia los datos del objeto al que hace referencia una variable, cambia los datos a los que hace referencia la otra . Ambas variables hacen referencia al mismo objeto . Por supuesto, puede haber muchos otras variables que también almacenan referencias a él".

"¿Qué hacen las variables de tipos compuestos (referencia/clase) si no tienen una referencia a un objeto? ¿Es eso posible?"

"Sí, amigo. Te estás adelantando con tu pregunta. Eso es posible. Si una variable de tipo referencia (compuesto) no almacena una referencia a un objeto, entonces almacena lo que se conoce como 'null'". referencia". Básicamente, esto significa que hace referencia a un objeto cuya dirección es 0. Sin embargo, la máquina Java nunca crea objetos con esta dirección, por lo que siempre sabe que si una variable de referencia contiene 0, entonces no está apuntando a ningún objeto ."

codigo Java Descripción
String s;
String s = null;
Declaraciones equivalentes.
Person person;
person = new Person();
person = null;
Creamos una variable de persona cuyo valor es nulo.
Le asignamos la dirección de un objeto Person recién creado.
Asignamos nulo a la variable.
Cat cat = new Cat();
cat.owner = new Person();
cat.owner.name = "God";
Creamos un objeto Cat y almacenamos su dirección en la variable cat; cat.propietario es igual a nulo.
Establecemos cat.propietario igual a la dirección de un objeto Persona recién creado.
cat.owner.name todavía es igual a nulo.
Establecemos gato.propietario.nombre igual a "Dios"

"¿Te entendí bien? Las variables se dividen en dos tipos: tipos primitivos y tipos de referencia. Los tipos primitivos almacenan valores directamente, mientras que los tipos de referencia almacenan una referencia a un objeto. Los tipos primitivos incluyen int, char, boolean y muchos otros. Referencia los tipos incluyen todo lo demás. Usamos clases para crearlos".

"Tienes toda la razón, hijo mío".

"Entonces, dices que has entendido todo. Aquí hay algunas tareas para ayudarte a reforzar tu conocimiento".