A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 盖保宁 黑马帝   /  2011-9-25 19:24  /  2172 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java函数中参数传递的时候,如果参数是基本类型,将按值传递,如果是对象将按引用传递

   void   swap(Integer   a,Integer   b)  
    {  
       Integer   t   =   new Integer(a);  
        a   =   b;  
        b   =   t;     
    }

    Integer a = new Integer(1);
    Integer b = new Integer(2);
    System.out.println("交换前"+a+ "       "+b);//1 2
    swap(a,b);     
    System.out.println("交换后"+a+ "       "+b);//1 2
    可是,结果为
     
       交换前1       2
       交换后1       2
   
    交换两个整形的值除了用数组有别的解决办法么

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

6 个回复

正序浏览
黑马网友  发表于 2011-9-30 11:56:43
7#
在java中没有引用传递,只有值传递
所谓值传递就是将实际参数的副本(复制品) 传入方法内.而参数本身不会受到影响,
public class TestPrimitiveTransfer
{
        public static void swap(int a , int b)
        {
                //下面三行代码实现a、b变量的值交换。
                //定义一个临时变量来保存a变量的值
                int tmp = a;
                //把b的值赋给a
                a = b;
                //把临时变量tmp的值赋给a
                b = tmp;
                System.out.println("swap方法里,a的值是" + a + ";b的值是" + b);
        }
        public static void main(String[] args)
        {
                int a = 6;
                int b = 9;
                swap(a , b);
                System.out.println("交换结束后,实参a的值是" + a + ";实参b的值是" + b);
        }
}
当程序执行到wrap方法时,系统进入swrap方法,并将main方法中的a,b变量作为参数值传入swrap,传入swrap方法传入的只是a  b的副本,
详细 的内容请看李刚老师的疯狂java讲义

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-29 18:34:16
地板
全局变量中的对象a b  和 swap方法中参数 a b 对象 引用的不是同一块内存
在swap方法中  把swap方法中参数对象 a b中的数据对调后,并没有影响到 全局变量a b 引用内存中数据。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
原来发了一条回复,回错地方了!!!!!
[ 本帖最后由 史卫平 于 2011-09-25  22:28 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-9-25 21:45:58
板凳
a,b是局部变量,参数传递完以后, a、b作为局部变量的内存被释放,所以a、b的值不变。
回复 使用道具 举报
[code=java]public class test{
private Integer a;
private Integer b;

public void   swap(Integer a,Integer b)   
    {   
       Integer t   = a;   
        this.a   =   b;   
        this.b   =   t;      
    }

public static void main(String args[]){
        test t = new test();
        t.a = new Integer(1);
        t.b = new Integer(2);
        System.out.println("交换前"+t.a+ "       "+t.b);//1 2
            t.swap(t.a,t.b);      
        System.out.println("交换后"+t.a+ "       "+t.b);//2 1

}
}[/code]不解释,自己理解
回复 使用道具 举报
黑马网友  发表于 2011-9-25 19:55:14
沙发
Integer是不可变对象,你并没有改变你传进去的Integer对象,
把方法void改成返回Integer类型,然后new一个新的Integer类型去赋值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马