¿Cuál es la diferencia entre una variable, objeto y referencia?

Exactamente, ¿cuáles son las diferencias entre variables , objetos y referencias ?

Por ejemplo: todos apuntan a algún tipo, y todos deben contener valores (a menos que, por supuesto, tenga el tipo de nula temporal), pero, ¿cómo son exactamente sus funciones e implementaciones diferentes entre sí?

Ejemplo:

Dog myDog = new Dog(); //variable myDog that holds a reference to object Dog int x = 12; //variable x that hold a value of 12 

Tienen los mismos conceptos, pero ¿cómo son diferentes?

(Para que quede claro, la explicación que ofrezco aquí es específica de Java y C #. No suponga que se aplica a otros lenguajes, aunque algunos bits sí).

Me gusta usar una analogía para decirle a alguien dónde vivo. Podría escribir mi dirección en una hoja de papel:

  • Una variable es como un pedazo de papel. Tiene un valor, pero no es el valor en sí mismo. Puedes tachar lo que está allí y escribir algo más en su lugar.
  • La dirección que escribo en el papel es como una referencia. No es mi casa, pero es una forma de navegar hacia mi casa.
  • Mi casa en sí es como un objeto. Puedo dar múltiples referencias al mismo objeto, pero solo hay un objeto.

¿Eso ayuda?

La diferencia entre un tipo de valor y un tipo de referencia es lo que se escribe en la hoja de papel. Por ejemplo, aquí:

 int x = 12; 

es como tener un pedazo de papel con el número 12 escrito directamente. Mientras:

 Dog myDog = new Dog(); 

no escribe el contenido del objeto Dog en la hoja de papel; crea un nuevo Dog y luego escribe una referencia al perro en ese papel.

En términos que no sean de analogía:

  • Una variable representa una ubicación de almacenamiento en la memoria. Tiene un nombre por el que puede referirse a él en tiempo de comstackción, y en tiempo de ejecución tiene un valor, que siempre será compatible con su tipo de tiempo de comstackción. (Por ejemplo, si tiene una variable Button , el valor siempre será una referencia a un objeto de tipo Button o alguna subclase, o la referencia null ).
  • Un objeto es una especie de entidad separada. Es importante destacar que el valor de una variable o cualquier expresión nunca es un objeto, solo una referencia. Un objeto efectivamente consiste en:
    • Campos (el estado)
    • Una referencia de tipo (nunca puede cambiar a lo largo de la vida del objeto)
    • Un monitor (para sincronización)
  • Una referencia es un valor utilizado para acceder a un objeto, por ejemplo, para llamar a métodos, acceder a campos, etc. Normalmente navega por la referencia con el . operador. Por ejemplo, si foo es una variable Person , foo.getAddress().getLength() tomará el valor de foo (una referencia) y llamará a getAddress() en el objeto al que hace referencia esa referencia. El resultado puede ser una referencia de String … luego llamamos a getLength() en el objeto al que hace referencia esa referencia.

A menudo uso la siguiente analogía cuando explico estos conceptos.


Imagina que un objeto es un globo. Una variable es una persona. Todas las personas están en el equipo de tipo de valor o en el equipo de tipo de referencia . Y todos juegan un pequeño juego con las siguientes reglas:

Reglas para tipos de valor :

  • Usted sostiene en sus arms un globo lleno de air. (Las variables de tipo de valor almacenan el objeto).
  • Siempre debes tener exactamente un globo. (Los tipos de valor no son anulables)
  • Cuando alguien más quiere tu globo, pueden hacer explotar uno idéntico y sostenerlo en sus arms. (En tipos de valor, el objeto se copia).
  • Dos personas no pueden sostener el mismo globo. (Los tipos de valores no se comparten).
  • Si desea sostener un globo diferente, debe abrir el que ya tiene y agarrar otro. (Un objeto de tipo de valor se destruye cuando se reemplaza).

Reglas para los tipos de referencia :

  • Puede sostener un trozo de cuerda que conduce a un globo lleno de helio. (Las variables de tipo de referencia almacenan una referencia al objeto).
  • Puedes sostener una cuerda o ninguna cuerda. (Las variables de tipo de referencia son anulables)
  • Cuando alguien más quiere tu globo, pueden obtener su propio pedazo de cuerda y atarlo al mismo globo que tienes. (En los tipos de referencia, la referencia se copia).
  • Varias personas pueden sostener trozos de cuerda que conducen al mismo globo. (Los objetos de tipo de referencia se pueden compartir).
  • Mientras haya al menos una persona sujetando la cuerda a un globo en particular, el globo está a salvo. (Un objeto de tipo de referencia está activo siempre que sea alcanzable).
  • Para cualquier globo en particular, si todos finalmente lo sueltan, entonces ese globo se va volando y ya nadie puede alcanzarlo. (Un objeto tipo de referencia puede volverse inalcanzable en algún momento).
  • En algún momento posterior al final del juego, un globo perdido puede explotar por sí solo debido a la presión atmosférica. (Los objetos inalcanzables son elegibles para la recolección de basura, que no es determinista).

Puedes pensar que es como responder preguntas.

Un objeto es un qué …
Es como cualquier cosa física en el mundo, una “cosa” que es reconocible por sí misma y tiene propiedades significativas que la distinguen de otras “cosas”. Como sabes, un perro es un perro porque ladra, mueve la cola y persigue una pelota si la arrojas.

Una variable es una que …
Como si miraras tus propias manos. Cada uno es una mano en sí misma. Tienen dedos, uñas y huesos dentro de la piel, pero sabes que una es tu mano izquierda y la otra la correcta. Es decir, puede tener dos “cosas” del mismo tipo / tipo pero cada una puede ser diferente a su manera, puede tener diferentes valores.

Una referencia es un lugar donde …
Si miras dos casas en una calle, aunque tienen su propia fachada, puedes llegar a cada una por su única dirección, lo que significa que si estás lejos como a tres cuadras o en otro país, podrías dígale a la dirección de la casa porque todavía estarán allí donde los dejó, incluso si no puede señalarlos directamente.

Ahora, por el bien de la progtwigción, ejemplos en C ++

 class Person{...} Person Ana = new Person(); //An object is an instance of a class(normally) 

Es decir, Ana es una persona, pero tiene propiedades únicas que la distinguen de otra persona.

 &Ana //This is a reference to Ana, that is to say, a "where" does the variable //"Ana" is stored, wether or not you know it's value(s) 

Ana misma es la variable para almacenar las propiedades de la persona llamada “Ana”

La respuesta de Jon es excelente para abordarla por analogía. Si una fraseología más concreta es útil para ti, puedo contribuir.

Comencemos con una variable. Una variable es una cosa [nombrada] que contiene un valor. Por ejemplo, int x = 3 define una variable llamada x, que contiene el número entero 3. Si luego lo sigo con una asignación, x=4 , x ahora contiene el número entero 4. La clave es que no reemplazamos La variable. No tenemos una nueva “variable x cuyo valor es ahora 4”, simplemente reemplazamos el valor de x con un nuevo valor.

Ahora vayamos a los objetos. Los objetos son útiles porque a menudo necesitas una “cosa” para hacer referencia desde muchos lugares. Por ejemplo, si tiene un documento abierto en un editor y desea enviarlo a la impresora, sería bueno tener solo un documento, referenciado tanto por el editor como por la impresora. Eso te ahorrará tener que copiarlo más veces de las que podrías desear.

Sin embargo, como no desea copiarlo más de una vez, no podemos simplemente poner un objeto en una variable. Las variables se aferran a un valor, por lo que si dos variables se aferraran a un objeto, tendrían que hacer dos copias, una para cada variable. Las referencias son el intermediario que resuelve esto. Las referencias son valores pequeños, fácilmente copiados, que se pueden almacenar en variables.

Por lo tanto, en el código, cuando escribe Dog dog = new Dog() , el nuevo operador crea un nuevo Dog Object y devuelve una referencia a ese objeto para que pueda asignarse a una variable. La asignación le da al dog el valor de una Referencia a su Objeto recién creado.

nuevo Dog () creará una instancia de un objeto Dog ie) creará una memoria para el objeto. Necesita acceder a la variable para manipular algunas operaciones. Para eso necesitas una referencia que sea Dog myDog. Si intenta imprimir el objeto, imprimirá un valor no legible que no es más que la dirección.

  myDog -------> new Dog().