Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

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 85

Preguntas 13

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

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.

Notas de la clase:

🎳 Los objetos son referencias a un espacio en memoria.
🎩 La mayoría de lenguajes de programación utilizan dos tipos de memorias: Stack y Heap.
📁 La memoria Stack es muy rápida, pero sin tanto espacio. Aquí guardamos los valores primitivos de nuestras variables (true, false, ‘JuanDC’, 16, etc).
🌪 La memoria Heap es un poco más lenta y nos permite guardar grandes cantidades de información. Son como los tornados: grandes, lentos y desordenados (😬). En esta memoria guardamos los valores de los objetos, las instancias de nuestras clases.

😱🙀 ¡Así también funciona en JavaScript!

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.

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

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

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.

Les hice un meme para reforzar lo aprendido

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 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.

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

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 ❤️

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

¿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ó 😦

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.

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!!!

💻 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.

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

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

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

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

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.

La profesora me parece que lo ha aclarado con respecto a variables con tipos primitivos y objetos. Y aquí hay algo curioso. Los tipos que no son primitivos, como String, son tratados como objetos y son almacenados la memoria heap.

Es interesante la verdad pero podemos llegar a asociar la clase String como un array del tipo char que sí es un tipo primitivo.

Aquí tienen una pequeña referencia que me encontré por ahí mientras investigaba ~ https://www.geeksforgeeks.org/storage-of-string-in-java/#:~:text=Stack space contains specific values,stored in the heap area.

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

Variable vs Objetos: Un vistazo a la memoria

<h4>Variables ≠ Objetos</h4>
int i = 0;
Doctor myDoctor = new Doctor();
Doctor myDoctor2 = new Doctor();

Estamos acostumbrados a que si asignamos o reasignamos el valor de una variable a otra el valor cambia, pero con los objetos funciona de otra manera.

El stack es la memoria de la computadora, el lugar donde cada que se crea una nueva variable/objeto este se almacena. Para el caso de las variables primitivas el valor esta almacenado directamente en el stack, en cambio los objetos no almacenan directamente los datos que contiene el objeto, sino que almacena una dirección de memoria donde están esos datos almacenados, este lugar se conoce como la memoria heap.

Cuando se hace una asignación de una variable a otra damos por hecho que la primera variable tomó el valor de la segunda, pero esto no sucede con los objetos. Cuando asignamos un objeto a otro lo que realmente estamos asignando es la dirección en memoria donde están los datos del objeto. Por lo tanto, si se hacen cambios en el objeto estos se harán en el mismo espacio de memoria al que están apuntando ambas variables; por lo que si consultamos los datos de las variables, tendrán los mismos datos aunque solo se haya modificado una de ellas.

Wow no sabia que al igualar los objetos en realidad lo que hacia era que apuntaran a la misma dirección de memoria. Eso explica porque mucho de mi código cuando inicie a programar no funcionaba bien :3

Lo que explica en esta clase esta muy relacionado con los punteros en c y c++
el funcionamiento es similar.

Uy que revelador, ahora ya comprendo porque carajos no me funcionaba aquel programa de ajedréz que intenté hacer en el colegio, JAJAJA



Excelente explicación, buena didáctica 😃

Me hace pensar en los punteros de C

Por eso el uso de listas cuando queremos recorrer nuestros objetos traidos desde la bdd. gracias

En síntesis, el nombre de la variable asignada a un objeto es en realidad un puntero.

Ya no me confundire con stack y heap

Freddy y Anahí son de mis favoritos☺️

La forma cómo habitan los datos es la diferencia entre objetos y variables.