Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181458
  • 博文数量: 61
  • 博客积分: 2215
  • 博客等级: 大尉
  • 技术积分: 625
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-10 21:20
文章分类
文章存档

2014年(2)

2013年(7)

2012年(4)

2011年(7)

2008年(11)

2007年(11)

2006年(19)

我的朋友

分类:

2006-03-28 13:09:26

看到“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) |
给主人留下些什么吧!~~