Java中的传递机制——值传递再次补充附源代码

接前面发表过的补充文章(文章链接),这次增加多了一种情况,原理还是值传递原理
写多一种情况能更方便的理解
情况1:创建副本,更改副本的值,删去副本,所以结果不变

情况2:创建副本,注意这里是直接传入地址。系统自动开辟main栈区和swap_2栈区,都指向a和b所在的值堆,当swap_2栈区更改值后,直接是更改了堆中的值,然后删去副本,于是原来的main栈指向更改后的堆,所以结果改变

情况3:创建副本,传入地址值,开辟main栈区和swap_3栈区,都指向a,b所在栈区,只是更改副本的指向值,没有改变堆中的值,然后删去副本,于是原来的main栈指向原来的堆,所以结果不变。

情况4:将副本的值变为空而已,删去副本,原来main栈区还是指向原来的堆,所以结果不变。

关于值传递,终究还是传递副本。

@author:肖佳嘉
package com.test;
public class Value_propagation {
	int a ;
	int b ;
	public Value_propagation() {
	}
	public Value_propagation(int i , int j) {
		a  = i ;
		b  = j ;
	}
	public static void main(String[] args) {
		//对四个对象的属性进行赋值
		Value_propagation vp = new Value_propagation(11,22);
		Value_propagation vp1 = new Value_propagation(11,22);
		Value_propagation vp2 = new Value_propagation(11,22);
		Value_propagation vp3 = new Value_propagation(11,22);
		int c = 11 ;
		int d = 22 ;
		System.out.println("========情况1========");
		//情况1:值相互交换: 结果不变
		vp.swap_1(c, d);
		System.out.println("c = " + c );
		System.out.println("d = " + d );
		System.out.println("========情况2========");
		//情况2:对象的属性值相互交换,结果改变
		vp.swap_2(vp);
		System.out.println("vp.a = " + vp.a);
		System.out.println("vp.b = " + vp.b);
		System.out.println("========情况3========");
		//情况3:对换对象地址值,结果不变
		vp.swap_3(vp1,vp2);
		System.out.println("vp1.a = " + vp1.a);
		System.out.println("vp1.b = " + vp1.b);
		System.out.println("vp2.a = " + vp2.a);
		System.out.println("vp2.b = " + vp2.b);
		System.out.println("========情况4========");
		//情况4:将对象赋为null,结果不变
		vp.swap_4(vp3);
		System.out.println("vp3.a = " + vp3.a);
		System.out.println("vp3.b = " + vp3.b);
		
	}
	public void swap_1(int a ,int b) {
		int temp = 0 ;
		temp = a ;
		a = b ;
		b = temp; 
	}
	public void swap_2(Value_propagation vp) {
		int temp = 0 ;
		temp = vp.a ;
		vp.a = vp.b ;
		vp.b = temp; 
	}	
	public void swap_3(Value_propagation vp1,Value_propagation vp2) {
		Value_propagation vp = new Value_propagation();
		vp = vp1;
		vp1 = vp2;
		vp2 = vp1;
	}
	public void swap_4(Value_propagation vp) {
		vp = null; 
	}
}   


测试结果:
======== 情况1 ========
c = 11
d = 22
======== 情况2 ========
vp.a = 22
vp.b = 11
======== 情况3 ========
vp1.a = 11
vp1.b = 22
vp2.a = 11
vp2.b = 22
======== 情况4 ========
vp3.a = 11
vp3.b = 22

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章