Esta es una pregunta clásica de la entrevista que confunde a los desarrolladores principiantes de Java. En esta publicación usaré un ejemplo y algún diagrama para demostrar que: Java es paso por valor.
1. Algunas definiciones
Pasar por valor: hacer una copia en la memoria del valor del parámetro actual que se pasa.
Pasar por referencia: pasar una copia de la dirección del parámetro actual.
Java siempre se pasa por valor. Los tipos de datos primitivos y la referencia de objetos son solo valores.
2. Pasar variable de tipo primitivo
Dado que Java se pasa por valor, no es difícil entender que el siguiente código no intercambiará nada.
swap(Type arg1, Type arg2) { Type temp = arg1; arg1 = arg2; arg2 = temp; } |
3. Pasar variable de objeto
Java manipula objetos por referencia y todas las variables de objeto son referencias. Sin embargo, Java no pasa los argumentos del método por referencia, sino por valor.
La pregunta es: ¿por qué se puede cambiar el valor de miembro del objeto?
Código:
class Apple { public String color="red"; } public class Main { public static void main(String[] args) { Apple apple = new Apple(); System.out.println(apple.color); changeApple(apple); System.out.println(apple.color); } public static void changeApple(Apple apple){ apple.color = "green"; } } |
Dado que la referencia original y copiada hacen referencia al mismo objeto, el valor del miembro cambia.
Producción:
red green