Java中函数参数的传递是值传递还是引用传递(转)

z

java参数传递时到底是值传递还是引用传递(baidu搜集)

最近比较长一段时间以来,网上的IT同行里面比较流行JAVA面试32问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其有一道题让我很费解。

原题是:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

google查询结果,得到答案基本上是:值传递。当时觉得挺纳闷儿,为什么连参数的内容都被修改了,怎么还能说是“值传递”呢?因为在传统的印象里(尤其是从C++过来以后),值传递都应该是不改变原参数的。

问问周围的同事,也大都这么讲,但是也都讲不清这种理论的根源是什么。我这个人有个毛病,有事情想不通时就会憋得难受,后来在《Thinking in Java》的一段内容(注解[1])里找到了自己的结论,我认为(《Thinking in Java》的作者也这么认为):可以说是值传递,也可以说是引用传递。

一,认为是值传递。得出这种结论的前提必须是“参数的值就是对该对象的引用,而不是对象的内容”,这句话可能有些费解,举个例子加以说明。

public class Paier {

     public static void main(String[] args) {

                    Paier paier = new Paier();

                    paier.test();

     }

    

     public void test() {

                    TestClass para1 = new TestClass();

                    para1.setTest(new Integer(10));

                    TestClass result1 = test1(para1);

                    System.out.println("para1   = " + para1.getTest());

                    System.out.println("result1 = " + result1.getTest());

                   

                    TestClass para2 = new TestClass();

                    para2.setTest(new Integer(10));

                    TestClass result2 = test2(para2);

                    System.out.println("para2   = " + para2.getTest());

                    System.out.println("result2 = " + result2.getTest());

     }

    

     public TestClass test1(TestClass t) {

                    t = new TestClass();

                    t.setTest(new Integer(20));

                    return t;

     }

    

     public TestClass test2(TestClass t) {

                    t.setTest(new Integer(20));

                    return t;

     }

    

     class TestClass {

                    Integer test = null;

                    public void setTest(Integer i) {

                                  test = i;

                    }

                    public Integer getTest() {

                                  return test;

                    }

     }

}

执行后的结果是:

para1   = 10

result1 = 20

para2   = 20

result2 = 20

为什么会这样呢?因为test1想通过修改参数的引用来修改返回值,但是在JAVA中,参数的引用是不可修改的,所以para1result1分别指向不同的空间,结果也不一样。而在test2中,result2para2始终指向同一块区域,test2方法修改的是参数内容,而不是参数的引用。

从上面看来,因为参数的引用不可改变,如果理解为“参数的值就是对该对象的引用”,那么java自然只有值传递。

二,认为是引用传递。还是上面的例子,如果在参数传递时理解为“参数的值就是该对象的内容”,那么显然不是值传递,因为对象的内容已经改变了。

认为是引用传递还有一个理由,就是java有一个保留字byvalue现在的JDK版本中还没有实现这个保留字,似乎是在暗示对这种观点的支持。(There appears to be some support for this view within Sun, since one of the “reserved but not implemented” keywords is byvalue.

所以说,对于原题的结论,是值传递还是引用传递并不重要,重要的是要理解“对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。”

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值