值传递
public class Testified {
public void Test1(int a) {
System.out.println(a);
a = 4;
System.out.println(a);
}
public static void main(String[] args) {
int num=67;
new Testified().Test1(num);
System.out.println(num);
}
}
/*运行结果:
67
4
67*/
如上代码中,main函数中赋值num=67,并在赋值后调用了 方法Test1,而此时语句new Testified().Test1(num);只是将num这个变量对应的值传了进去,而不是变量本身,所以并不会对num的值产生影响,而局部变量a得到数值“67”,所以第一次输出就是67,然后在对a进行二次赋值,所以第二次输出为4,而main函数中输出结果为num值即67;
地址传递
public class Testified {
public void Test2(int [] a) {
System.out.println(a[1]+"..."+a[3]);
a[1]=4;
a[3]=5;
System.out.println(a[1]+"..."+a[3]);
}
public static void main(String[] args) {
int []num= new int[] {11,22,33,44,55,66};
new Testified().Test2(num);
System.out.println(num[1]+"..."+num[3]);
}
}
/*运行结果:
22...44
4...5
4...5*/
如上代码中,main函数中定义了一个数组 num={11,22,33,44,55,66};注意,数组是引用数据类型,此时num中存储的不是一个数据类型,而是一个地址,而这个地址中存储着我们给num定义的数组;然后调用了Test2函数,int [] a接收了num的地址,此时,Test2方法如上,并不会对地址进行变更,而是对地址所对应的存储的值执行操作,所以System.out.println(a[1]+"…"+a[3])根据a得到的地址,输出了对应的数组中的数,然后进行二次赋值,所以第二次输出为第二次赋值结果,正是因为如此,num的地址对应的数组,已经被如上过程变更,所以最后输出结果为4…5。