看到“Java的所有参数传递都是值传递”这句话时,起初有些不解,后来看了一些讨论,自己动手用程序试了试才搞明白这句话的意思。
用以下的这个程序就可以来理解上面这句话的意义。
class stu
{
int id;
stu(int i){id=i;};
}
public class swaptip {
public static void main(String []args) {
stu a = new stu(8);
stu b = new stu(40);
System.out.println("a: " + a);
System.out.println("b: " + b);
//上面两个打印语句可以证明a,b的内容为对象stu(8),stu(40)的地址
System.out.println("a: " + a.id);
System.out.println("b: " + b.id);
swap(a, b);
System.out.println("After swap()");
System.out.println("a: " + a);
System.out.println("b: " + b);
//经过swap()函数后,a,b的内容不变,因为他们的内容只是对象地址的一个拷贝
System.out.println("a: " + a.id);
System.out.println("b: " + b.id);
swap1(a,b);
System.out.println("After swap1()");
System.out.println("a: " + a);
System.out.println("b: " + b);
//经过swap1()函数后,a,b的内容仍然不变
System.out.println("a: " + a.id);
System.out.println("b: " + b.id);
}
//由于java是值传递(对于对像来说形参接受的内容为所传对象地址的一个考备)所以下面的
//函数在调用时,其中o1,o2起初被传递的是a,b的地址的一个拷贝,而在函数体中只对o1,o2
//的内容做了改变,而并非对它们所指地址做改变,所以a1,a2中仍为stu(8)
//stu(40)这两个对像的地址值,显示结果仍是a=8,b=40
public static void swap(stu o1, stu o2) {
System.out.println("o1:"+o1);
System.out.println("o2:"+o2);
//用这两个打印语句来证明o1,o2里也是存stu(8),stu(40)这两个对象的地址的拷贝
stu t = o1;
o1=o2;
o2=t;
}
//若将上面的函数改为
public static void swap1(stu o1,stu o2)
{
int t=o1.id;
o1.id=o2.id;
o2.id=t;
}
//这样的话,就相当于把o1,o2所指的地址中的id域的内容交换了,所以显示就不一样了.
}
对于简单的数据类型理解值传递不是问题,而对于对象类型就是理解为传递的内容是实参引用的一个拷贝(这个值),这样正是值传递,而非引用传递。
阅读(993) | 评论(0) | 转发(0) |