referencias - tipos de variables en java netbeans
¿Cuál es la diferencia entre una variable, un objeto y una referencia? (5)
(Solo para que quede claro, la explicación que estoy dando aquí es específica para Java y C #. No asuma que se aplica a otros lenguajes, aunque algunos de ellos pueden).
Me gusta usar una analogía de decirle a alguien dónde vivo. Podría escribir mi dirección en una hoja de papel:
- Una variable es como un trozo de papel. Tiene un valor, pero no es el valor en sí mismo. Puedes tachar lo que esté allí y escribir algo más.
- La dirección que escribo en el papel es como una referencia. No es mi casa, pero es una forma de navegar a 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 trozo de papel con el número 12 escrito directamente. Mientras:
Dog myDog = new Dog();
no escribe el contenido del objeto Perro en la hoja de papel, crea un nuevo
Dog
y luego escribe una referencia al perro en ese papel.
En términos no análogos:
-
Una variable representa una ubicación de almacenamiento en la memoria.
Tiene un nombre con el que puede referirse a él en tiempo de compilación, y en tiempo de ejecución tiene un valor, que siempre será compatible con su tipo de tiempo de compilación.
(Por ejemplo, si tiene una variable
Button
, el valor siempre será una referencia a un objeto de tipoButton
o alguna subclase, o la referencianull
). -
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 consiste efectivamente en:
- Campos (el estado)
- Una referencia de tipo (nunca puede cambiar durante la vida útil del objeto)
- Un monitor (para sincronización)
-
Una referencia es un valor que se utiliza para acceder a un objeto, por ejemplo, para llamar métodos sobre él, acceder a campos, etc. Normalmente navega por la referencia con
.
operador. Por ejemplo, sifoo
es una variablePerson
,foo.getAddress().getLength()
tomaría el valor defoo
(una referencia) y llamaría agetAddress()
en el objeto al que se refiere esa referencia. El resultado podría ser una referencia deString
... luego llamamos agetLength()
en el objeto al que se refiere esa referencia.
Esta pregunta ya tiene una respuesta aquí:
- ¿Qué son las clases, referencias y objetos? 10 respuestas
¿Cuáles son exactamente las diferencias entre variables , objetos y referencias ?
Por ejemplo: todos apuntan a algún tipo, y todos deben contener valores (a menos, por supuesto, que tenga el tipo nulo temporal), pero ¿cómo son 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 ¿en qué se diferencian?
A menudo uso la siguiente analogía al explicar estos conceptos.
Imagina que un objeto es un globo. Una variable es una persona. Cada persona está 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 los tipos de valor :
- Tienes en tus brazos un globo lleno de aire. (Las variables de tipo de valor almacenan el objeto).
- Siempre debes estar sosteniendo exactamente un globo. (Los tipos de valor no son anulables).
- Cuando alguien más quiere tu globo, puede volar su propio globo idéntico y sostenerlo en sus brazos. (En los tipos de valor, el objeto se copia).
- Dos personas no pueden sostener el mismo globo. (Los tipos de valor no se comparten).
- Si quieres sostener un globo diferente, debes hacer estallar el que ya estás sosteniendo y agarrar otro. (Un objeto de tipo de valor se destruye cuando se reemplaza).
Reglas para 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).
- Se le permite sostener una cuerda o ninguna cuerda. (Las variables de tipo de referencia son anulables).
- Cuando alguien más quiere tu globo, puede obtener su propio trozo de cuerda y atarlo al mismo globo que tú. (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 que todavía sostenga la cuerda de un globo en particular, el globo estará a salvo. (Un objeto de tipo de referencia está vivo siempre que sea accesible).
- Para cualquier globo en particular, si todos eventualmente lo sueltan, entonces ese globo se va volando y ya nadie puede alcanzarlo. (Un objeto de tipo de referencia puede volverse inalcanzable en algún momento).
- En algún momento posterior antes de que termine el 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).
La respuesta de Jon es excelente para abordarlo por analogía. Si una redacción más concreta es útil para usted, 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 entero 3. Si luego lo sigo con una asignación,
x=4
, x ahora contiene el entero 4. La clave es que no reemplazamos La variable.
No tenemos una nueva "variable x cuyo valor ahora es 4", simplemente reemplazamos el valor de x con un nuevo valor.
Ahora pasemos a los objetos. Los objetos son útiles porque a menudo se necesita hacer referencia a una "cosa" 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 le ahorrará tener que copiarlo más veces de lo que desee.
Sin embargo, debido a que no desea copiarlo más de una vez, no podemos simplemente colocar un objeto en una variable. Las variables se mantienen en un valor, por lo que si dos variables se mantienen en 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 y fáciles de copiar que se pueden almacenar en variables.
Entonces, en código, cuando escribe
Dog dog = new Dog()
, el nuevo operador crea un nuevo objeto Dog 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.
Puedes pensarlo como una respuesta a 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 otra "cosa".
Como si supieras que un perro es un perro porque ladra, mueve la cola y persigue una pelota si la lanzas.
Una variable es una que ...
Como si miras 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 derecha.
Es decir, puede tener dos "cosas" del mismo tipo / tipo, pero cada una puede ser diferente a su manera, puede tener valores diferentes.
Una referencia es un donde ...
Si observa dos casas en una calle, aunque tienen su propia fachada, puede llegar a cada una por su dirección única, lo que significa que si está lejos como a tres cuadras o en otro país, podría diga 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 programación, ejemplos en forma de 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
es la variable para almacenar las propiedades de la persona llamada "Ana"
new Dog () creará una instancia de un objeto Dog, es decir, creará una memoria para el objeto. Necesita acceder a la variable para manipular algunas operaciones. Para eso necesitas una referencia que es Dog myDog. Si intenta imprimir el objeto, imprimirá un valor no legible que no es más que la dirección.
myDog -------> new Dog().