接前面發表過的補充文章(文章鏈接),這次增加多了一種情況,原理還是值傳遞原理
寫多一種情況能更方便的理解
情況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