El método llamado por es un término estándar de informática. Las llamadas de método se dividen en llamadas de valor (llamada por referencia) y llamadas de referencia (llamada por valor) de acuerdo con la situación de aprobación de parámetros. Hay muchas definiciones de estos dos tipos de llamadas en el mundo. El dicho más común es que el valor es la llamada de valor, y la dirección es la llamada de referencia. Esto es en realidad muy inapropiado. Estas declaraciones pueden recordarnos fácilmente que el paso del parámetro de objeto de Java es una llamada de referencia. De hecho, el paso del parámetro de objeto de Java sigue siendo una llamada de valor.
Primero usemos un código para confirmar por qué el paso del parámetro de objeto Java es una llamada de valor.
Public Class Employee {public String name = null; Public Employee (String n) {this.name = n; } // intercambia dos objetos de empleados public static void swap (empleado e1, empleado e2) {empleado temp = e1; e1 = e2; e2 = temp; System.out.println (e1.name+""+e2.name); // Resultado de impresión: li si zhang san} // función principal public static void main (string [] args) {empleado trabajador = nuevo empleado ("zhang san"); Manager de empleado = nuevo empleado ("Li Si"); intercambio (trabajador, gerente); System.out.println (trabajador.name+""+gerente.name); // El resultado de la impresión sigue siendo: Zhang San Li Si}}El resultado anterior es muy decepcionante. Aunque se intercambiaron el contenido de los objetos de parámetros formales E1 y E2, el trabajador y el gerente de objetos de parámetros reales no intercambiaron contenido. La razón más importante aquí es que los parámetros formales E1 y E2 son las copias de la dirección del trabajador y gerente de los parámetros reales.
Como todos sabemos, en Java, los nombres de variables del objeto realmente representan la dirección del objeto en el montón (el término profesional se llama referencia del objeto). Cuando se llama al método Java, los parámetros pasan una referencia al objeto. Es importante destacar que las direcciones de memoria ocupadas por parámetros formales y parámetros reales no son las mismas. El contenido en parámetros formales es solo una copia de la referencia de objeto almacenada en los parámetros reales.
Si tiene alguna comprensión del área variable local de la pila Java en JVM Memory Management (consulte "Arquitectura de máquina virtual Java"), comprenderá muy bien la oración anterior. Cuando el JVM ejecuta el programa anterior, ejecutar el método principal y el método de intercambio presionará dos espacios de memoria llamados marcos de pila en la pila Java. Hay una memoria llamada área variable local en el marco de la pila principal para almacenar referencias a los objetos de parámetros reales trabajador y gerente. El área variable local en el marco de la pila de intercambio almacena referencias a los objetos de parámetros formales E1 y E2. Aunque los valores de referencia de E1 y E2 son los mismos que los del trabajador y el gerente, ocupan diferentes espacios de memoria. Cuando se intercambian las referencias entre E1 y E2, la figura a continuación muestra claramente que no afectará los valores de referencia del trabajador y el gerente en absoluto.
El paso del parámetro del objeto Java sigue siendo una llamada de valor, aunque se pasa la dirección (referencia). Es hora de dar la llamada de referencia y la llamada de valor una definición precisa.
Llame por valor: Durante el proceso de aprobación de parámetros, los parámetros formales y los parámetros reales ocupan dos espacios de memoria completamente diferentes. El contenido almacenado por el parámetro formal es una copia del contenido almacenado por el parámetro real. De hecho, el paso de los objetos Java cumple esta definición, excepto que el contenido almacenado por parámetros formales y parámetros reales no es el valor variable en el sentido convencional, sino la dirección de la variable. Bueno, piense en: ¿no es la dirección de una variable también un valor?
Llame por referencia: durante el proceso de paso de parámetros, los parámetros formales y los parámetros reales son completamente el mismo espacio de memoria, y los dos no se distinguen entre sí. De hecho, los nombres de parámetros formales y los nombres de parámetros reales son solo símbolos diferentes en la programación. Durante la operación del programa, el espacio almacenado en la memoria es lo más importante. Diferentes nombres de variables no indican el espacio de almacenamiento de memoria ocupado de manera diferente.
En términos generales, los conceptos básicos de las dos llamadas no son si se pasa el valor o la dirección (después de todo, la dirección también es un valor), sino si los parámetros formales y los parámetros reales ocupan el mismo espacio de memoria. De hecho, el parámetro del puntero que pasa en C/C ++ también es una llamada de valor. Si no lo cree, ¡intente el siguiente código C!
#include <stdio.h> void swap (int *a1, int *b1) {int *t = a1; a1 = b1; b1 = t; } int main () {int x1 = 100; int x2 = 200; int *a = & x1; int *b = & x2; printf (" %d %d/n",*a,*b); intercambio (a, b); printf (" %d %d/n",*a,*b); regresar 0; }Pero C/C ++ tiene llamadas de referencia, que es un método de declaración variable llamado referencia int a; int & ra = a; donde ra es un alias de a. No hay diferencia entre los dos en la memoria y ocupa el mismo espacio de memoria. El paso de los parámetros a través de la referencia (alias) está en línea con las características de las llamadas de referencia. Puede probar los resultados de ejecución de Void Swap (Int & A1, Int & B1);
A través de este artículo, debe saber si los parámetros del método Java se denominan referencia o valor.