Comprensión de la transferencia de valor de Java:
Código 1:
prueba de clase pública { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); public static void SChange (StringBuffer str) { str= new StringBuffer("huang");Código 2:
prueba de clase pública { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); public static void SChange (StringBuffer str) { //str= new StringBuffer("huang"); str.append(" huang");Usemos dos imágenes para explicar el código 1 y el código 2 anteriores respectivamente:
estado original
Diagrama de código 1:
Comprensión del código 2:
En el código 1, la referencia de copia apunta a un nuevo objeto. Pero el objeto original permanece inalterado.
En el código 2, la referencia de copia cambia el objeto original.
Este es el paso por valor de Java.
La diferencia entre dos tipos de transferencia en C++:
Para el paso de valores de C++, el paso de referencias y los métodos de puntero, utilice el siguiente código para comprender y ejecutar la prueba usted mismo.
#include <stdio.h> #include <iostream> #include <typeinfo> void ByValue(int a) { a = a + 1 } void ByRef(int& a) { a = a + 1 void ByPointer(int* a) { *a = *a + 1; } int principal(int argv, char** args) { int v = 1; ByRef(v); // Pasar por referencia ByPointer(&v); // Pasar por valor int* vp = &vp; std::cout << v << std::endl; cout << typeid(vp).name() << std::endl; // std::cout << typeid(&vp).name() << std::endl; std::cout << "fin" << std::endl }La primera se pasa por valor y la segunda función se pasa por referencia, pero para las dos últimas, la misma función se llama una vez mediante Llamada por referencia y una vez mediante Llamada por valor.
porque:
ByPointer(vp); si no se cambia vp, no se puede cambiar. Pasar por valor
ByPointer(&v); cambios v. Pasar por referencia (puede decir que lo que se pasa es en realidad la dirección de v, y ByPointer no puede cambiar la dirección de v, por lo que esto es Llamada por valor. Esto se explica por sí mismo, pero la dirección de v son datos puros. Cuando La llamada no existe en el código cuadrado. Para la persona que llama, solo hay v, y la función ByPointer cambia la v. Este resultado es exactamente lo que llama. El comportamiento de referencia. Considerar el comportamiento es la intención original de la estrategia de evaluación. Si todo se abstrae en valores y el problema se considera desde la perspectiva de los datos, no es necesario introducir el concepto de estrategia de evaluación para confundir a la audiencia. )
nob: Se reconoce la comprensión anterior. El método de puntero complementario se puede utilizar de dos maneras: pasar un puntero, pasar la dirección o referencia de una variable; Vea &v y vp, encontrará que ambos son de tipo Punto, por lo que dos actuaciones tienen el mismo resultado. Puedes pensar en mí así
PorValor(&v); //error
, mientras que pasar parámetros de diferentes tipos en C++ no pasará la compilación directamente.
Resumir:
Entonces creo que si pasas por valor o por referencia, solo necesitas ver cómo va en la memoria.
Compartir memoria significa pasar una referencia y copiar memoria significa pasar un valor (dejando de lado primero algunos casos especiales)
En este caso:
C / C ++: pasar por valor de forma predeterminada, pasar por referencia y los punteros se entienden por separado (se puede entender que los punteros pasan por valor o por referencia, y los resultados son los mismos)
JAVA: los tipos de datos básicos se pasan por valor y los objetos también se pasan por valor (copie la referencia de este objeto)
C#: pasar valor por tipo de valor, pasar por referencia por tipo de referencia, comprensión especial de ref/out
Las cadenas en JAVA y C# necesitan una comprensión especial. La apariencia es pasar por valor, pero la implementación real depende de la máquina virtual.