No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Java SE Orientado a Objetos

Curso de Java SE Orientado a Objetos

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Variable vs. Objeto: Un vistazo a la memoria

15/38
Recursos

Un objeto es una referencia a un espacio en memoria. Cuando creamos objetos, Java los guarda en la memoria y nos devuelve coordenadas con las que podremos acceder a la información que almacenamos.

Existen dos tipos de memoria: Stack y Heap.

La memoria Stack es mucho más rápida y nos permite almacenar nuestra información de forma “ordenada”. Aquí se guardan las variables y sus valores de tipos de datos primitivos (booleanos, números, strings, entre otros).

Los objetos también usan la memoria Stack, pero no para guardar su información, sino para guardar las coordenadas a la verdadera ubicación del objeto en la memoria Heap, una memoria que nos permite guardar grandes cantidades de información, pero con un poco menos de velocidad.

Aportes 111

Preguntas 14

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Que importante es la pedagogía para transferir conocimientos. Hace poco estoy estudiando programación. Quizás este tema no sea tan complejo, pero lo traté de entender por distintos videos, apuntes e incluso un profesor universitario, pero la verdad esta es la primera vez que realmente lo entiendo acabadamente. Creo que el sello distintivo de Platzi es el énfasis que ponen en el aspecto pedagógico.

Jaja recuerdo que el profe dejo una tarea en el que aparecía en consola más rápido el número 8 si lo poníamos en una variable primitiva y lo imprimíamos y luego un objeto que imprimía también el 8. El más rápido era la variable primitiva en aparecer. El problema es que yo no supe explicar el porqué (claro por esa memoria Stack). Vaina si hubiera visto esta clase antes…pero no tenía plata en ese momento jajaja.

Hay que tener en cuenta que en stack también se guardan las funciones que se van llamando durante el programa, se van apilando en el orden de llamado y así mismo van saliendo tan pronto finalizan su tarea.
Es importante tener esto en cuenta si se quiere trabajar con recursión, pues éste tipo de tecnicas pueden ocasionar un StackOverflow durante el programa, básicamente rebosar de funciones nuestro stack llevando la capacidad de memoria de nuestra máquina al límite…

si los profesores explicaran asi de bien, mucha gente no le tendria miedo a java

Les hice un meme para reforzar lo aprendido

¿De dónde salió ese código de patient?

Es por eso que existen 2 tipos de variables.
Las variables de tipo primitivo, int, char, float, etc.
Y las variables de referencia, que lo que almacenan es una dirección de memoria.

Esto pasa porque al final del día, una variable solo puede almacenar un valor a la vez. Para romper esa limitación, está el concepto de variable de referencia.

Una pregunta que le pasa a la dirreccion en memoria a la que ya no se esta gaciendo referencia,
Se limpia junto con los datos que tenia?
Se mantiene cierto tiempo?
Se mantiene hasta que se acabe el programa?

En éste punto del curso lo eh repetido 3 veces con esta, si estás leyendo esto no te desanimes, un consejo es que hagas muchos ejercicios sencillos aplicando las primeras clases de éste curso para que la teoría vaya quedando más clara y cuando llegues otra vez a éste punto del curso sea más fácil de comprender porque hace Anahi ciertas cosas, se que es confuso en un principio pero la clave es practicar y practicar para poder entender como y el porque se aplica la teoría de esa manera, no es un camino fácil pero una vez que lo entiendes sientes una paz interior tan grande que no te la puedo explicar en el mensaje, saludos a todos y a seguir en este camino ❤️

En el minuto 4:37, Anahí duplica el código con la siguiente combinación de teclas: Ctrl+Alt+FlechaAbajo. NOTA: No es necesario seleccionar toda la línea para duplicar, tan solo colocar el cursor de texto sobre la línea. NOTA2: Puedes duplicar bloques de código seleccionando todo el bloque y haciendo la combinación de letras.

¿Por qué nunca me explicaron esto de la memoria “stack” y la memoria “heap” en la Universidad? Y no creo que me haya volado esa clase, simplemente no existió 😦

Excelente explicación:
Stack, tipos de datos primitivos, y direcciones de memoria que apuntan a Heap
Heap: ubicación de los atributos de los objetos

  • Un objeto es una referencia a un espacio en memoria. Cuando creamos objetos, Java los guarda en la memoria y nos devuelve coordenadas con las que podremos acceder a la información que almacenamos.

  • Existen dos tipos de memoria: Stack y Heap.

  • La memoria Stack es mucho más rápida y nos permite almacenar nuestra información de forma “ordenada”. Aquí se guardan las variables y sus valores de tipos de datos primitivos (booleanos, números, strings, entre otros).

  • Los objetos también usan la memoria Stack, pero no para guardar su información, sino para guardar las coordenadas a la verdadera ubicación del objeto en la memoria Heap, una memoria que nos permite guardar grandes cantidades de información, pero con un poco menos de velocidad.

¿Platzi tiene un curso de estructuras de datos no lo veo?

Para entender la diferencia entre una variable y un objeto desde la perspectiva de la memoria, es importante comprender cómo se gestionan en la memoria del ordenador. ### Variables Primitivas Las variables primitivas son los tipos de datos más básicos y sencillos. En lenguajes como Java, los tipos primitivos incluyen `int`, `char`, `boolean`, `byte`, `short`, `long`, `float`, y `double`. Estos tipos de datos se almacenan directamente en la memoria. #### Ejemplo: javaCopiar código`int i = 0`; * **Tipo**: `int` (entero) * **Valor**: `0` Aquí, la variable `i` es de tipo entero y se almacena directamente en la memoria con el valor `0`. La memoria asignada a `i` contiene directamente el valor `0`. ### Objetos Los objetos, en cambio, son instancias de clases y pueden contener múltiples variables y métodos. A diferencia de las variables primitivas, los objetos se almacenan de manera diferente en la memoria. #### Ejemplo: javaCopiar código`String name = "Ann"`; * **Tipo**: `String` * **Valor**: `"Ann"` En este caso, `name` es un objeto de la clase `String`. En Java, los objetos se almacenan en el heap (montículo), y la variable `name` contiene una referencia (una especie de puntero) a la ubicación del objeto `String` en el heap. ### Diferencias en la Memoria #### Variables Primitivas: * **Stack Memory**: Las variables primitivas se almacenan en la stack (pila), que es una región de la memoria donde se gestionan las variables locales y se maneja de manera automática. La stack es eficiente en términos de velocidad de acceso. #### Objetos: * **Heap Memory**: Los objetos se almacenan en el heap, una región de memoria destinada a objetos y estructuras dinámicas. La variable que apunta al objeto (en este caso, `name`) se encuentra en la stack, pero la instancia real del objeto `String` está en el heap. * **Referencia**: La variable `name` contiene una referencia al objeto en el heap, no el valor directo. Esto permite que los objetos sean más complejos y flexibles, ya que pueden contener otros objetos y estructuras de datos. ### Visualización de Memoria 1. **Variable Primitiva (int i = 0)**La dirección de memoria `1001` contiene el valor `0` directamente. * Stack:cssCopiar código`| Address` | Value | |---------|-------| `| 1001 | 0` | 2. **Objeto (String name = "Ann")**La dirección de memoria `2001` en la stack contiene una referencia (puntero) a la dirección `3001` en el heap, donde realmente se almacena el valor `"Ann"`. * Stack:yamlCopiar código`| Address | Value |` `|---------|---------|` `| 2001 | 3001 | (Referencia al heap)` * Heap:luaCopiar código| Address | Value | `|---------|---------|` `| 3001 | "Ann"` | ### Relación Uno a Uno y Uno a Muchos * **Uno a Uno**: Una variable primitiva tiene una relación uno a uno con el valor que almacena. Ejemplo: `int i = 0;` — una variable `i` que almacena un solo valor `0`. * **Uno a Muchos**: Un objeto puede contener múltiples valores y referencias a otros objetos, lo que establece una relación uno a muchos. Ejemplo: `String name = "Ann";` — el objeto `String` puede contener una secuencia de caracteres (en este caso, `"Ann"`), que es esencialmente un array de caracteres (`char[]`). ### Conclusión La gestión de variables primitivas y objetos en la memoria resalta sus diferencias fundamentales en términos de almacenamiento y acceso. Las variables primitivas son simples y directas, almacenándose en la stack, mientras que los objetos son más complejos y se almacenan en el heap, con referencias en la stack. Esta diferencia en la memoria es crucial para entender la eficiencia y el manejo de datos en la programación.

Hola!
No se si se mencionara en clases posteriores pero:
Algo que paso durante la interaccion de Anahi, al ella cambiar la referencia que ya poseia “patient2” a la direccion en memoria que tenia “patient” es que, la informacion u objeto que inicialmente tenia patient2, pasa a ser colectado por el GC
¿Que es el GC?
Gc es Garbage Collector, este es un sistema que es parte del JVM, que ayuda al manejo de memoria, esta es una de las ventajas mas grande de Java, frente a otros lenguajes mas antiguos. El GC, permite que el programador no tenga que preocuparse por que habra pasado con la memoria que estaba ocupando anteriormente. Sino que, luego de un tiempo el GC, determina que ese objeto al cual apuntaba “patient2” donde tenia el nombre de anahi, etc, pues ahora pasa a ser basura, y podemos liberar ese espacio en memoria. No se puede forzar a usar el GC, existen ciertos metodos incluidos en el universo de Java, que claman hacerlo, pero la verdad es que, no se puede determinar con exactitud, cuando el GC, entendera que ciertos datos en memoria, ya pueden ser eliminados.

Los objetos la ubicacion no almancena directamente los datos que tiene el objeto, lo que almacena es la direccion en memoria del lugar donde en verdad se estan almacenando los datos del objetos.

Este lugar se llama heap, estructura en modo de arbol.

la clase con la mejor explicacion que he visto despues de tres cursos con Anahi, en esta sí fue al detalle

Hola. Encontré esta info sobre memoria stack y heap, espero que les pueda servir

https://edgarjayo.wordpress.com/2020/10/30/explicando-la-memoria-stack-y-heap-de-java-1-3/



Esta clase serviría mucho en JavaScript para enseñar esto, porque no lo enseñan así.
Yo lo había estudiado de una manera similar por el JustJavascript de Dan Abramov, pero con la clase de Anahí, muy bien!!!

Los nutriólogos no son doctores, change my mind.

Osea si asignamos otra informacion diferete en una variable primitiva como lo seria // int i = 0; al ponerle otra informacion como por ejemplo // int b = 6; y despues // b = i; la informacion cambia porque la asignacion es directa, ahora b vale 0 y vemos donde esta. Pero si ponemos un Objeto ej: myDoctor y le ponemos asi: myDoctor2 = myDoctor; lo que se esta asignando en realidad son las direcciones en memoria, asi que lo que estoy haciendo es que un objeto tenga la direccion del otro objeto. Y SI YO EDITO EN myDoctor2 ENTONCES VA A EDITAR LOS DATOS DE myDoctor POR DEFECTO.

💻 La asignación de datos en memoria stack es extremadamente rápida, en cambio head es más lenta pero amplia.

Súper interesante explicación de como funciona la asignación de datos en memoria.

Entonces al asignar un objeto a otro objeto, se eliminaría la referencia del objeto que fue asignado con otro?

Estupenda clase instructora Anahí, por medio de esta me quedo más claro como internamente se maneja la información y lo que sucede al asignar un objeto a otro.

Muy importante saber las diferencias entre variables y objetos.

Java hace la asignación automática por se un lenguaje de alto nivel, pero si quieren asignar memoria de verdad, usen punteros con C, el curso de C de aquí de platzi esta muy bueno.

Sin embargo me quedo una duda, que pasa con ese espacio en memoria donde estaba guardada la información de patient2? Sigue existiendo o se borra automáticamente? Lo pregunto porque al imprimir los objetos te da la referencia de la ubicación, es posible volver el mismo objeto a esa ubicación y recuperar esa información alguien sabe?

Tranquilos si no encuentran el código de Patient.java, que tiene que ver con la siguiente tema que es el Reto.

Clase magistral
Vaayahhh que Explicacion tan Genial, AnnCode si que es una Excelente Porffe , me ha quedado super claro la asignacion de variables y Objectos en Memoria \[ Stack vs Heap ] \n Un Ejemplo Practico seria los Enlaces Symbolicos en un OS Unix \[ Linux ] donde se tienen los iNodos que apuntan los Archivos en Linux a Ubicaciones en Memoria entocnes Yo puedo crear un Link con ln que apunte a la misma ubucacion en memoria de mi archivo original , lo mismo ocurre para directorios en Linux lo cual es Genial una vez lo entiendes bien . \nSuper Clases.
Excelente clase, tener esto claro es clave.
Una ves hice algo como A[][]=B[][] y al hacer operaciones estos se alteraban como dice la profe al ver que esta clase era de teoria me desanime no crei que seria la explicación a lo que tiempo atras me habia sucedido
Cuando hace el ejemplo, se comprende más fácil. ☕
Me gustó realmente esta explicación, es muy digerible! Suelo hablar mientras avanza el video para argumentar y ver si me equivoco o estoy en lo cierto. No sé si a alguien más le funcione pero es un método de estudio cómodo y personal.

Yo recomendaría hablar de las consecuencias de pasar un objeto por valores o referencia. Es muy importante conocer estos conceptos porque son muy comunes en entrevistas o ejercicios.

¿La estructura **heap** y **stack** se almacena en Memoria Principal? ¿Estas estructuras son propias de java o son estructuras estándar que crea el sistema operativo para cualquier programa en ejecución?

al final lo que hiciste una asignacion por referencia haciendo que apunten al mismo punto en memoria lo que se debe hacer es romper esta relacion para que doctor2 apunte a un lugar diferente

Me quedé con la duda de lo que significaba lo que salía en consola al imprimir los objetos“patient” y “patient2” y les puedo explicar lo siguiente:

El método System.out.println() convierte el objeto que le pasamos como parámetro (en este caso patient y patient2) en una cadena llamando a String.valueOf(), si nos adentramos a este método veremos algo como:

public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
}

Es decir, si el objeto pasado es null retorna null, si no llama al método obj.toString().

Object.toString() retorna lo siguiente:

getClass().getName() + '@' + Integer.toHexString(hashCode())

Por lo que en nuestro resultado anterior “Patient@74a14482” indica que Patient es el nombre de la clase y 74a14482 es la representación hexadecimal sin firma del código hash del objeto. En pocas palabras hashCode() devuelve un valor entero, generado por un algoritmo hash.

Memoria heap -> Estructura en modo de árbol.
Memoria Stack-> Almacena la dirección en memoria.

Adjunto mi codigo, explicando el porceso 😊

//Memoria de objetos
        Patient myPatient = new Patient("Ramiro","[email protected]");
        Patient myPatient2 = new Patient("Andres","[email protected]");
        System.out.println(myPatient.getName());
        System.out.println(myPatient2.getName());
        myPatient2 = myPatient; // Igualando la direccion de memoria
        System.out.println("\n" + myPatient);
        System.out.println(myPatient2);
        System.out.println("\n" + myPatient.getName());
        System.out.println(myPatient2.getName());
        myPatient2.setName("Saray"); // Se cambia el valor para los dos pacientes ya que se encuentran en la misma direccion de memoria
        System.out.println("\n" + myPatient.getName());
        System.out.println(myPatient2.getName());

Bien claro lo de la memoria

A ver si entendí:

  • Variable se guarda en el almacenamiento stack

  • Objeto se guardan en heap y en stack solo se guarda la dirección de su almacenamiento. Si se quiere guardar el valor que tiene el objeto 1 al 2, entonces solo lo que hace es modificar su dirección, así mostrar los datos que están almacenados ahí. No modifica el valor, solo apunta al objeto 1.

La principal diferencia entre int e Integer es que int es un tipo de dato primitivo, lo que significa que se almacena directamente en la memoria, mientras que Integer es una clase que encapsula un valor int y proporciona métodos para trabajar con él.

Muy interesante, deben haber formas mejores de clonar objetos.

claro es mas fácil decir que estas pasando los valores por referencia y claramente si no utilizas un método estas accediendo al mismo punto en memoria y cambiar la variable lo haces con el dato padre…

Creo que cuando apuntas los dos objetos a una misma referencia se le conoce como mutabilidad,ya que el obj1 esta mutando al obj2 y asi sucesivamente si hacemos un cambio a obj2 se pasa al obj1.
Juan DC explica esto con una presentación en JavaScript por si alguien le interesa ❤️

No me sabía esta propiedad 😨. Estoy dando un repaso a POO con el curso de Platzi.

Excelente explicación

Me gusta porque te haces entender Anahí

Vamos, se puede decir que los objetos de Java son punteros. Muy interesante, cada lenguaje suele tener sus “trucos” a la hora de gestionar estas cosas y es muy importante entenderlo bien, ya que sino puedes perder un montón de horas tratando de corregir un error. ¡Excelente clase!

En resumen al inicializar un metodo con un valor de otro metodo, ambos sobrescriben la misma informacion ya que se alojaron en el mismo espacio en memoria, como buen uso de esto, utilizamos los metodos de encapsulamiento get y set, para controlar el acceso y modificacion de los atributos que comparten los dos metodos.

en que momento genero el los métodos de getName(){}, tuve que ver el vídeo muchas veces XD

Variable = directamente en stack
Objeto = stack tiene una referencia hacia heap

Que importante saber esto, me gusto mucho esta clase

Recuerdo que en una ocasión me salió un error en el trace de la consola y salían esas direcciones en memoria solo que en ese entonces no lo sabia.

Genial!

En el caso de las variables su posicion se ve en pantalla. Pero en el caso de los OBJETOS la ubicacion y el almacenamiento en el stak(lo que vemos en pantalla, o sintaxis del codigo) son diferentes. No almacenamos directamente los datos que contiene el objeto, sino que lo que estamos codificando, es la direccion en memoria donde realmete se estan almacenando los datos del objeto! ESTE LUGAR SE CONOCE COMO LA MEMORIA HIP(heap)

Recomiendo ver las diferencias entre asignación por referencia y asignación por valor.

buena la clase

Variables: Los valores de las variables son almacenados en el stack (estructura de datos LIFO de acceso rápido) de forma ordenada.
Objetos: Se almacena la rerencia de memoria (dirección de memoria) en la estructura de datos heap de forma desordenada

Entendí cosas incluso de JavaScript con esta clase jaja, increíble como un concepto bien explicado te cambia todo, gracias.

Precisamente en una entrevista me salió esa pregunta jajajaja. Buena explicación, todo muy claro.

De las mejores clases … 7 meses de aprender en Platzi y el contenido junto con la forma de transmitir la idea es de altísimo nivel.

muy buena explicación sobre Stack y Heap de la memoria. Me ha pasado que cuando igualo un objeto y luego cambio un atributo del objeto igualado cambia también el atributo del objeto principal y no sabia porque esto ahora me queda claro; y para hacer dicho ejercicio toca es clonar el objeto.

muchas gracias por la explicación, muy claro

Wow esto aclara muchas cosas.

Excelente explicación muy fácil de comprender

Excelente explicación!!

excelente aclaracion en cuanto a lo que es objetos y variables

Entendido!

Totalmente Claro.

Gracias, excelente contenido.

Excelente explicación.

Excelente explicación!

interesante 😃

Todo muy claro!!😁
Es muy importante saber la diferencia entre un objeto y una variables.

En que momento hicimos el constructor de Pacient :0

Jaime, en datos o variables privitivas al igualar, la asignacion de valores es directa, en el caso de objetos no. Tienes que setear, si no, te muestra la localidad en memoria.

Platzi sin duda es increíble, esto no lo sabía. Este curso esta super.

De verdad siempre pense que las variables igual guardaban referecias al lugar en memoria donde se almacenan no directamente el valor.

Definitivamente es un paradigma de programación mucho más versátil

Excelente!

No entiendo! En el caso de las variables primitivas pasaría lo mismo. NO?

Hola Anahi,

Como es el manejo de la memoria, para las variables static. Se comportan como variables de tipo primitivas?.

Saludos.

Si vienen de C o C++ esta clase es como los punteros en dicho idiomas.

Estoy bien en decir? que cuando únicamente declaramos una variable de tipo objeto: Persona persona1; lo que hacemos es únicamente reservar memoria con la referencia de persona1, pero cuando hacemos lo siguiente: Persona persona1 = new Persona();
creamos el objeto y la referencia a donde se ubica.

Es muy similar a la manera de trabajar en lenguaje C++ cuando operamos punteros específicamente.

me viene a la mente los punteros de C, tal ves primitivos también, pero predecesores de los objetos por lo que entiendo de ésta clase.

Q tipo de magia negra es???
Esa clase de pasient de donde salio hahhaah.
q susto we :V
En fin obvio la crearon.

El tema que Anahí toca es muy importante. Saber que los objetos se almacenan diferente que las variables primitivas permite conocer (y evitar) un error muy común de principiantes que puede dejarnos un poco sorprendidos y extrañados. Les dejo un ejemplo que hice:

public class Main {
    public static void main(String[] args) {
        Doctor myDoctor = new Doctor("Barry Allen");
        Doctor otherDoctor = new Doctor("Barry Allen");

        // false
        System.out.println("Doctors are the same?: " + (myDoctor == otherDoctor));
    }
}

Aunque creamos dos objetos con el mismo valor en el argumento que pasamos al constructor, si hacemos una comparación entre ellos, se evaluará a false. Esto se debe justamente a que no estamos comparando valores concretos de los objetos. Estamos comparando ubicaciones en memoria y, como explica la profe, los objetos se almacenan en ubicaciones diferentes. ¡Espero les sea de ayuda! 😃

El Stack almacena varibles y dirección de memoria que apuntan a Heap
Heap almacena los atributos de los objetos.

Vaya, por fin entendí!!! Esa pregunta del cambio de datos en memoria la había visto en un libro hace meses pero no entendía porque el valor de la variable se alteraba.

La explicación de las coordenadas estuvo genial. 😃
Muchas gracias!!


muy buena explicación

i es una variable
myDoctor() es un objeto
Ambos ocupan un espacio en memoria
la variable SI toma el valor de lo asignado, incluyendo el mismo espacio en memoria
El objeto apunta a una dirección en memoria Heap
Si igualo un objeto con otro, pueden ser igual en contenido
pero estarán ocupando 2 espacios de memoria diferentes
y tendrán direccione Heap diferentes