JavaRush /Blog Java /Random-ES /Tipos de datos de referencia en Java

Tipos de datos de referencia en Java

Publicado en el grupo Random-ES
Sin comprender la sintaxis de Java, es imposible convertirse en un desarrollador serio, por eso hoy continuamos aprendiendo la sintaxis. En uno de los artículos anteriores hablamos de variables primitivas, pero como hay dos tipos de variables, hoy hablaremos del segundo tipo: los tipos de referencia en Java. ¿Así que qué es lo? ¿Por qué se necesitan tipos de datos de referencia en Java? Tipos de datos de referencia en Java - 1Imaginemos que tenemos un objeto de TV con algunas características, como número de canal, volumen del sonido y bandera:
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
¿Cómo puede un tipo simple como intalmacenar estos datos? Recordemos: una variable inttiene 4 bytes. Pero dentro hay dos variables (4 bytes + 4 bytes) del mismo tipo, y también boolean(+1 byte)... Total: de 4 a 9, pero como regla general, se almacena mucha más información en un objeto. ¿Qué hacer? No puedes poner un objeto en una variable. En este punto de nuestra historia aparecen las variables de referencia. Las variables de referencia almacenan la dirección de la ubicación de memoria en la que se encuentra un objeto específico. Es decir, se trata de una “tarjeta de visita” con una dirección, con la que podemos encontrar nuestro objeto en la memoria compartida y realizar algunas manipulaciones con él. Una referencia a cualquier objeto en Java es una variable de referencia. Así es como se vería con nuestro objeto TV:
TV telly = new TV();
Configuramos una variable de tipo TV con un nombre tellya un enlace al objeto creado de tipo TV. Es decir, la JVM asigna memoria en el montón para el objeto TV, lo crea y la dirección de su ubicación en la memoria lo coloca en la variable tellyque se almacena en la pila. Puede leer más sobre la memoria, es decir, la pila y mucha otra información útil, en esta conferencia . Una variable de tipo TV y un objeto de tipo TV, ¿te diste cuenta? Esto no es en vano: los objetos de un determinado tipo deben tener variables correspondientes del mismo tipo (sin contar la herencia y las implementaciones de interfaz, pero ahora no lo tomamos en cuenta). Después de todo, no vamos a servir sopa en vasos, ¿verdad? Resulta que nuestro objeto es un televisor y su variable de referencia es como un panel de control. Usando este control remoto podemos interactuar con nuestro objeto y sus datos. Por ejemplo, configurar las características de nuestro televisor:
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
Aquí usamos el operador de punto .para acceder y comenzar a usar los elementos internos del objeto al que se refiere la variable. Por ejemplo, en la primera línea le dijimos a la variable telly: "Danos una variable interna isOndel objeto al que estás haciendo referencia y configúrala como verdadera" (enciende el televisor por nosotros).

Redefiniendo variables de referencia

Digamos que tenemos dos variables de un tipo de referencia y los objetos a los que hacen referencia:
TV firstTV = new TV();
TV secondTV = new TV();
Si escribimos:
firstTV = secondTV;
esto significará que asignamos a la primera variable como valor una copia de la dirección (el valor de los bits de dirección) al segundo objeto, y ahora ambas variables se refieren al segundo objeto (en otras palabras, dos controles remotos para el mismo TELEVISOR). Al mismo tiempo, el primer objeto quedó sin variable que haga referencia a él. Como resultado, tenemos un objeto al que no se puede acceder, porque la variable era un hilo tan condicional para él, sin el cual se convierte en basura, simplemente permanece en la memoria y ocupa espacio. Posteriormente, el recolector de basura destruirá este objeto de la memoria . Tipos de datos de referencia en Java - 2Puedes romper el hilo conector con un objeto sin otro vínculo:
secondTV = null;
Como resultado, solo habrá un enlace al objeto: firstTVy secondTVya no apuntará a nadie (lo que no nos impide asignarle un enlace a algún objeto como TV en el futuro).

clase de cadena

Por separado, me gustaría mencionar la clase String . Esta es una clase base diseñada para almacenar y trabajar con datos almacenados como una cadena. Ejemplo:
String text = new String("This TV is very loud");
Aquí hemos pasado una cadena para almacenarla en el constructor del objeto. Pero nadie hace eso. Después de todo, se pueden crear cadenas:
String text = "This TV is very loud";
Mucho más conveniente, ¿verdad? En términos de popularidad de uso, Stringno es inferior a los tipos primitivos, pero sigue siendo una clase y la variable que se refiere a ella no es un tipo primitivo, sino un tipo de referencia. Tenemos Stringesta maravillosa habilidad de concatenar cadenas:
String text = "This TV" + " is very loud";
Como resultado, obtendremos el texto nuevamente: This TV is very loud, ya que las dos líneas se combinarán en un todo y la variable se referirá a este texto completo. Un matiz importante es que Stringse trata de una clase inmutable. ¿Qué significa? Tomemos este ejemplo:
String text = "This TV";
text = text + " is very loud";
Parece que todo es sencillo: declaramos una variable, le damos un valor. En la siguiente línea lo cambiamos. Pero realmente no cambiamos. Como se trata de una clase inmutable, en la segunda línea no se cambia el valor inicial, sino que se crea uno nuevo, que a su vez consta del primero + " is very loud".

Constantes de referencia

En el artículo sobre tipos primitivos, abordamos el tema de las constantes. ¿ Cómo se comportará una variable de referencia cuando la declaremos final ?
final TV telly = new TV();
Se podría pensar que esto hará que el objeto sea inmutable. Pero no, eso no es cierto. Tipos de datos de referencia en Java - 3Una variable de referencia con un modificador finalestará vinculada a un objeto específico sin la posibilidad de desvincularlo de ninguna manera (redefinirlo o equipararlo null). Es decir, después de establecer el valor de dicha variable, código como:
telly = new TV();
o
telly = null;
provocará un error de compilación. Es decir, finalsólo actúa sobre el vínculo y no tiene ningún efecto sobre el objeto en sí. Si inicialmente lo tenemos mutable, podemos cambiar su estado interno sin problemas:
telly.soundVolume = 30;
¡A veces, las variables se designan como finales incluso en los argumentos del método!
public void enableTV (final TV telly){
   telly.isOn = true;
}
Esto se hace para que durante el proceso de escritura de un método estos argumentos no puedan ser anulados y, en consecuencia, creen menos confusión. ¿Qué pasa si denotamos finaluna variable de referencia que hace referencia a un objeto inmutable? P.ej String:
final String PASSWORD = "password";
Como resultado, obtendremos una constante, un análogo de las constantes de tipo primitivo, porque aquí no podemos redefinir la referencia ni cambiar el estado interno del objeto (datos internos).

resumámoslo

  1. Mientras que las variables simples almacenan bits de valor, las variables de referencia almacenan bits que representan cómo se recupera un objeto.
  2. Las referencias a objetos se declaran para un solo tipo de objeto.
  3. Cualquier clase en Java es un tipo de referencia.
  4. El valor predeterminado de cualquier variable de referencia en Java es null.
  5. Stringes un ejemplo estándar de un tipo de referencia. Esta clase también es inmutable.
  6. Las variables de referencia con un modificador finalestán vinculadas a un solo objeto sin posibilidad de redefinición.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION