JavaRush /Blog Java /Random-ES /Pasar parámetros en Java
vincent_vega
Nivel 24
Gainesville

Pasar parámetros en Java

Publicado en el grupo Random-ES
Una variable en Java es un contenedor que contiene un valor. Entonces, ¿qué significa "pasar" una variable? ¿Y cuál es la diferencia entre tipos de datos primitivos y de referencia?
Pasar parámetros en Java - 1
Llegaremos a eso más tarde. Comencemos primero con una tarea simple. Qué hace este código:
int х = 3;
int у = х;
En la línea 1, se crea una variable x de tipo int y se le asigna el valor 3. En la línea 2, se crea una variable y de tipo int y se le asigna el valor de la variable x . En el futuro, la variable x no afectará a y de ninguna manera . Java copia el valor de x (3) y coloca esa copia en y . Esto es pasar un parámetro por valor. No escribes una variable en otra. El valor se copia y se asigna a una nueva variable. Expresión y = x; NO significa " escribir xey " . Significa "copiar el valor dentro de x y escribir esa copia en y ". Si luego cambio y :
у = 34;
¿Afectará esto a x ? Por supuesto que no. x todavía tiene el valor 3. Si cambio x más tarde :
х = 90;
¿ Cómo le afectará esto ? De ninguna manera. No guardan relación alguna una vez realizada la asignación (COPIANDO el valor). ¿Qué pasa con los tipos de referencia? ¿Cómo trabajan? No es tan difícil, de hecho la regla es la misma. Los enlaces hacen lo mismo: obtienes una copia del enlace. Entonces si digo:
Cat A = new Cat ();
Cat B = A;
El enlace A se copia al enlace B. Esto no se aplica al objeto; todavía solo tienes un objeto. Pero ahora tienes dos referencias diferentes controlando el mismo objeto Cat . Ahora veamos cómo pasar parámetros a métodos. Java pasa parámetros por valor. Siempre. Esto significa "copiar el valor y pasar la copia". Para tipos primitivos es fácil:
int х = 5;
doStuff (х); / / Передать копию х (significado 5) в метод doStuff
El método doStuff se ve así:
void doStuff (int у) {

   / / Действия с 'y'
}
Se pasa una copia del valor de x , es decir, 5, al método doStuff() . El método doStuff() tiene su propia variable llamada y . La variable y es una variable nueva y diferente. Con una copia de lo que había en x al momento de pasarlo al método. De ahora en adelante, y y x no se afectan entre sí. Cuando cambias y , no afectas a x .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
Y viceversa: si cambia x , no cambiará y . Lo único que hizo x en este caso fue copiar su valor y pasarlo al método doStuff() . ¿Cómo funciona "pasar por valor" con referencias? Mucha gente dice: "Java pasa tipos primitivos por valor y objetos por referencia". No es lo que dicen. Java pasa todo por valor. Con las primitivas, obtienes una copia del contenido. Con los enlaces también obtienes una copia del contenido. ¿Pero cuál es el contenido del enlace? Control remoto. Instalaciones para la gestión/acceso a la instalación. Cuando pasas una referencia a un objeto a un método, estás pasando una copia de la referencia. Clon de control remoto. El objeto todavía está en la pila donde fue creado, esperando que alguien use el control remoto. A la instalación no le importa cuántos controles remotos estén "programados" para controlarla. Las únicas personas a las que les importa esto son el recolector de basura y tú, el programador. Entonces cuando dices:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Sólo hay un objeto Cat . Pero ahora dos controles remotos (enlaces) pueden acceder al mismo objeto Cat . Entonces, ahora cualquier cosa que B haga con el objeto Cat afectará al Cat al que apunta A , ¡pero no afectará el contenido de A ! Puedes cambiar Cat usando el nuevo enlace B (copiado directamente de A ), pero no puedes cambiar A. ¿Que demonios significa esto? Puede cambiar el objeto al que se refiere A , pero no puede cambiar la referencia de A ; redirigirlo a otro objeto o null . Entonces, si cambia la referencia de B (no el objeto Cat real al que hace referencia B , sino el valor de la referencia en sí) , no cambiará el valor de A. Y viceversa. Entonces:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
Simplemente significa que B apunta a otro objeto. A todavía está feliz. Así que repite conmigo: Java pasa todo por valor. (Está bien, una vez más... con sentimiento). Java pasa todo por valor. Para tipos primitivos, pasa una copia del valor actual, para referencias de objetos, pasa una copia de la referencia (control remoto). Nunca pasas el objeto. Todos los objetos se almacenan en el montón. Siempre. ¡Ahora prepara una buena taza de café y escribe un código! Artículo original .
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION