Transferencia de valor y transferencia de referencia en java (solo transferencia de valor en java, sin transferencia de referencia)

Paso de valores y paso de referencias en Java y Javascript 

Conversión de tipo String y tipo StringBuffer

Convierta entre matriz de caracteres, clase String y StringBuffer en Java

Transferencia de valor (el valor del parámetro real se copia y se pasa al parámetro formal)

Pasar por referencia (la dirección de memoria del parámetro real se copia y se pasa al parámetro formal)

Problema: solo hay transferencia de valor en java, no hay transferencia de referencia

Qué es la transferencia de valor, la transferencia de valor es copiarse a sí mismo y pasar la copia copiada a otros ( nota: el punto clave y la característica de la transferencia de valor es la copia).

Independientemente de si es transferencia de valor o transferencia de referencia, se copia. Sin embargo, la transferencia de valor copia el valor y la transferencia de referencia copia la dirección de memoria, y la clave y característica de la transferencia de valor es la copia, por lo que desde la perspectiva de la copia En términos de pasar por valor y pasar por referencia, ambos necesitan ser copiados , por lo tanto, solo hay un paso de valor en java .

Sin embargo, desde la perspectiva del contenido de la transferencia , la transferencia de valor es el valor copiado y la transferencia de referencia es la dirección de memoria copiada . Por lo tanto , hay transferencia de valor y transferencia de referencia en Java , por lo que depende de cuál sea desde En términos de perspectiva!

Caso 1

String s1 = "江西省赣州市于都县";
		String s2 = s1;
		System.out.println(s1 + "," + s1.hashCode() + "," + System.identityHashCode(s1));
		System.out.println(s2 + "," + s2.hashCode() + "," + System.identityHashCode(s2));
		s2 = "于都县"; //s2指向了新的空间地址
		System.out.println(s1 + "," + s1.hashCode() + "," + System.identityHashCode(s1));
		System.out.println(s2 + "," + s2.hashCode() + "," + System.identityHashCode(s2));

Caso 2: Transferencia de valor

//交换2个变量的值
	public void swapValue(int num1, int num2) {
		System.out.println("交换前,形参num1=" + num1 + ",形参num2=" + num2);
		int temp;
		temp = num1;
		num1 = num2;
		num2 = temp;
		System.out.println("交换后,形参num1=" + num1 + ",形参num2=" + num2);
	}

public static void main(String[] args) {
		System.out.println("*********************************");
		User user = new User();
		int x = 5, y =10;
		System.out.println("调用swapValue函数前,实参x=" + x + ",实参y=" + y);
//值传递(参数是基本类型(byte,short,int,long,float,double,char,boolean),传递的是基本类型的字面量值的拷贝。)
		user.swapValue(x, y);
		System.out.println("调用swapValue函数后,实参x=" + x + ",实参y=" + y);
	}

Caso 3: Pasar por referencia

public static void main(String[] args) {
		User user = new User();
		//引用传递(参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。)
		StringBuffer stra = new StringBuffer ("1");
		System.out.println (stra);
		user.changeStr(stra);
		System.out.println (stra);//1,yes 引用类型因为是传递地址,因此修改了堆内存的同一对象
	}
	
	public void changeStr(StringBuffer stringBuffer){
		stringBuffer.append (",yes");
	}

Caso 4: Pasar por referencia (en una función, reasignar parámetros formales)

public static void main(String[] args) {
		User user = new User();
		//
		StringBuffer stra = new StringBuffer ("江西省赣州市于都县");
		System.out.println ("实参stra=" + stra);//实参stra=江西省赣州市于都县
		user.changeStr(stra);
		System.out.println ("实参stra=" + stra);//实参stra=江西省赣州市于都县
	}
	
	public void changeStr(StringBuffer stringBuffer){
//new StringBuffer("hello")这句话让stringBuffer指向了新的地址空间
		stringBuffer = new StringBuffer("hello");//此时形参和实参已经分道扬镳了
		stringBuffer.append("world");
		//形参stringBuffer=hello
		System.out.println("形参stringBuffer=" + stringBuffer);
	}

Caso 5: El caso especial de pasar por referencia ( tipo String )

Como arriba: el parámetro formal original str y el parámetro actual s apuntan a la misma área de memoria de pila , y luego str = "20" apunta la memoria de str a otra memoria de pila, dando como resultado un resultado especial.

public static void main(String[] args) {
		User user = new User();
		//
		String s = "10"; //实参s的值为10
		System.out.println ("实参s=" + s + "," + System.identityHashCode(s));//实参s
		user.changeString(s);
		//String是引用类型,传递的是地址,但是并未发生改变		
		System.out.println ("实参s=" + s + "," + System.identityHashCode(s));//实参s
	}
	
	public void changeString(String str){
		System.out.println("形参str=" + str + "," + System.identityHashCode(str));
		str = "20";
//		str = "10"; //大家可以解除注释,测试运行这行代码(这里把形参str的值设置成和实参s的值一样时,形参和实参的地址是一样的)
		System.out.println("形参str=" + str + "," + System.identityHashCode(str));
	}

El código System.identityHashCode (str) puede entenderse como la obtención de la dirección de memoria del objeto str.

Supongo que te gusta

Origin blog.csdn.net/czh500/article/details/114599531
Recomendado
Clasificación