2021/03/21 Problemas encontrados al pasar parámetros a métodos en Java

Introducir

Nuestro propósito es intercambiar el contenido de los elementos de la matriz. A continuación se muestra el código de la Figura 1, que es el código que escribí por primera vez.

Figura de código 1

Inserte la descripción de la imagen aquí

  • La lista de parámetros del método de intercambio que definimos es el parámetro formal a y el parámetro formal b
  • El resultado de este programa sigue siendo 2 1. Es decir, el contenido de los elementos de la matriz no ha cambiado.
  • ¿Por qué? ¿No pasamos los valores de los dos elementos de la matriz?
  • Mire el diagrama de memoria 1 a continuación

Mapa de memoria 1

Inserte la descripción de la imagen aquí

  • Ilustración: Dado que no tenemos la dirección de la matriz cuando llamamos al método de intercambio, incluso si se produce un intercambio de datos, no afectará a la matriz original.
  • Hablemos de nuestro código Figura 2 a continuación

Figura de código 2

Inserte la descripción de la imagen aquí

  • ¿Cuál es la diferencia entre el diagrama de código 2 y el diagrama de código 1?
  • La principal diferencia es que la lista de parámetros del método de intercambio es diferente
  • La lista de parámetros del método de intercambio en el código de la Figura 1 es el parámetro formal a y el parámetro formal b
  • La lista de parámetros del método de intercambio en el código de la Figura 2 no solo tiene un parámetro formal ay un parámetro formal b, también tenemos un grupo de parámetros adicional
  • Entonces, cuando usamos el método de intercambio, podemos cambiar directamente el contenido de la matriz
  • El resultado de ejecutar el programa esta vez es 1 2
  • Consulte el diagrama de memoria 2

Mapa de memoria 2

Inserte la descripción de la imagen aquí
Cuando llamamos al método de intercambio, la dirección puede apuntar a la matriz almacenada en el montón.

expandir

  • Primero, primero presentamos dos conceptos, paso de valores y paso de referencias.
  • Transferencia de valor: Pase el parámetro actual al método, y la copia del parámetro real se entrega al parámetro formal. No importa cómo el parámetro formal cambie el parámetro real copiado, no afectará el parámetro real.
  • Pasar por referencia: Pase el parámetro actual al método, y el parámetro actual se transfiere directamente al parámetro formal. Si se cambia el parámetro formal, el parámetro real se verá afectado en consecuencia.
  • ¿Nuestro diagrama de código 1 y el diagrama de código 2 anteriores se pasan por valor o por referencia?
  • Algunas personas piensan que la figura de código 1 es transferencia de valor y la figura de código 2 es transferencia de referencia. Debido a que los parámetros pasados ​​en el Código 1 son todos valores numéricos, los parámetros pasados ​​en la Figura 2 del Código tienen valores numéricos y direcciones.
  • Esta idea es incorrecta.
  • No hay paso por referencia en Java, todos se pasan por valor
  • La figura de código 1 no tiene dirección y no puede afectar los elementos de la matriz. Los parámetros reales son los valores de índice 0 y 1. Después de usar estos dos parámetros reales, los dos parámetros reales no han cambiado, sino 0 y 1
  • La figura de código 2 tiene una dirección, que se puede utilizar para afectar los elementos de la matriz. El parámetro real es el valor de la dirección de la matriz, los valores de índice son 0 y 1. Después de usar estos tres parámetros reales, los tres parámetros reales no han cambiado, la dirección de la matriz sigue siendo la dirección de la matriz y los valores de índice Siguen siendo 0 y 1.
  • Java utiliza un método especial para lograr el mismo efecto que la transferencia de referencia, pero no afectará a los parámetros reales. Esta transferencia se llama transferencia compartida. La transferencia compartida es un caso especial de transferencia de valor.
  • Presentemos la tercera situación, mire el diagrama de código 3 y el diagrama de código 4.

Código Figura 3 Clase de usuario y código Figura 4 Clase de prueba

Código Figura 3 Clase de usuario

Inserte la descripción de la imagen aquí

Código Figura 4 Clase de prueba

Inserte la descripción de la imagen aquí

Resultados de ejecución del programa

Inserte la descripción de la imagen aquí

  • ¿Por qué es este resultado? Pasamos el valor de la dirección de un objeto de usuario. Se dice que la impresión en el método principal debería verse afectada por el método método, y el resultado de ambos tiempos debería ser el "método método". Pero, ¿por qué es diferente de lo que esperábamos?
  • Expliquemos este problema, consulte el diagrama de memoria 3

Figura de memoria 3

Inserte la descripción de la imagen aquí

  • Nota: Cuando llamamos al método método, se crea un nuevo objeto de usuario en el cuerpo del método. Por lo tanto, el objeto de usuario al que apunta el método método y el método principal no es el mismo

Supongo que te gusta

Origin blog.csdn.net/hypertext123/article/details/115067730
Recomendado
Clasificación