Diferencias entre variables primitivas y objetos en la memoria
Resumen
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.
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.
TAL CUAL!!! Pienso exactamente igual y me paso igual en la vida de la programacion. teng 32 con una meta de convertirme en programador. la verdad solo repetia como loro, pero con estas clases me detengo en cada 30 sg para anotar y aplicar lo que aprendo. y di haaa era asi.. o ahaa era por eso o aquello. jaja
Totalmente de acuerdo contigo
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...
exelente aporte!
si los profesores explicaran asi de bien, mucha gente no le tendria miedo a java
Yo creo que si todos explicaran así, la gente no le tendría miedo a programar en general
Misma metodología a usar en matemáticas
Les hice un meme para reforzar lo aprendido
entonces cual seria la forma correcta de copiar un objeto para que al modicarlo no se modifique el original, me quedo esa duda
¿De dónde salió ese código de patient?
me pregunto lo mismo
Es la magia de la programación, cuando tienes código que ni sabes de dónde salió.
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?
cuando se deja de hacer referencia, esta se limpia junto con los datos que tenia.
si y si. Se mantiene por unos miliosegundos hasta que pasa el recolector de basura y libera el especio de memoria, esto quiere decir que ese espacio queda libre para ser reutilizado por un nuevo objeto, yen ese moimento se limpia todo a los valores por defecto de los atrubutos del nuevo objeto.
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 <3
Con esto entendi todo. Muchas gracias.
¿Que pasa con el espacio en memoria que antes tenia myDoctor2, desaparece o sigue estando llena?
El garbage collector se encargará de liberar ese espacio cuando ya no se use
Básicamente lo que pasa es que cuando un objeto esta mucho tiempo sin instanciar el Garbage collector lo elimina, tu por tu cuenta igualmente lo puedes hacer con System.gc(); pero es muy mala practica aplicar este mismo.
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.
A mi me realiza es ctrl + d por defecto
¿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ó :(
En la universidad no nos explican ni un cuarto de lo que realmente es programar 😕
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
Podria myDoctor2 apuntar a su dirección en memoria original?
Estimados esta pregunta esta muy interesante, una vez que cambiamos la dirección de memoria a la que apuntábamos, podríamos acceder nuevamente al espacio de memoria anterior para visualizar los datos del objeto que fue instanciado originalmente?????
son dos espacios en memorias diferentes ;)
Si String es un Objeto en Java (según yo entiendo), por qué no pasa esto mismo con String (no apuntan a la misma dirección en memoria)???
un objeto String, ej.
String obj
Si es un objeto, pero tambien puedes usar los metodos estáticos de la clase String usando directamente el nombre de la clase, no se si a eso te refieres? ya que un objeto de String y los metods estaticos de String no estan en la misma dirección saludos :)
Gracias jorge, pero me refiero al apuntado en memoria, donde al instanciar un objeto, y al crear otro que apunte al objeto anterior, modificar a cualquiera de estos dos objetos, afectará a ambos, debido a que estos apuntan al mismo espacio en memoria donde se encuentra el objeto (memoria Heap).
Si String es objeto (o bueno una clase), y yo instancio un objeto String, al crear otro objeto String que sea igual al objeto String anterior, al modificar cualquiera de los dos, no se afectan ambos, por qué???
Osea que no hay mucha diferencia entre guardar una variable y un objeto (hablando de uso de memoria)? La memoria heap es mas grande?
La diferencia radica en que si guardas una variable o un dato primitivo se guarda su valor en la memoria stack, mientras que un objeto no guarda su valor, sino la dirección o las coordenadas en la memoria heap. Además de lo que mencionas que es más grande y su velocidad de acceso es más lenta.
¿Como puedo asignarle al objeto una direccion de memoria especifica?
La unica forma que conozco es con:
Object obj1 ="Valor x";Object obj2 = obj1;
En este caso Obj2 tiene la direccion de Obj1 y ambos apuntan la mismo valor, no sé si esto responda tu duda.
Java es un lenguaje que no cuenta con apuntadores como tal en Java no se programa con apuntadores, porque Java siempre utiliza apuntadores explícitos. Los apuntadores son las referencias a la memoria y estos son muy comunes en lenguajes tipo C y estos dan un aire a manejar Memoria Dinámica, si buscas algo como eso te recomiendo un lenguaje como Go. Si tienen mas dudas sobre Java contesto MDs.
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.