Stackoverflow问答:Java是传值还是传引用?

来自:并发编程网 - ifeve.com

原文:http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value

译者:叶文海

译文:http://ifeve.com/stackoverflow-reference-or-value/

译者注:这是一篇在Stackoverflow上面的一个经典问题,也是Java开发者容易混淆的一个问题,我节选了其中两个vote最高的回复进行翻译。


问题:我一直认为Java的参数是按引用传递,然而我看过一些文章里说Java的参数并不是按引用传递的,比如这篇,这让我很迷惑。Java中的参数到底是按引用传递还是按值传递?


回答1:


在Java里参数是按值来传递的。比较难理解的可能是Java传递的是对象的引用,但这些引用是按值传递。


比如:

public static void main( String[] args ){

Dog aDog = new Dog("Max");

foo(aDog);

if( aDog.getName().equals("Max") ){ //true

System.out.println( "Java passes by value." );

}else if( aDog.getName().equals("Fifi") ){

System.out.println( "Java passes by reference." );

}

}

public static void foo(Dog d) {

d.getName().equals("Max"); // true

d = new Dog("Fifi");

d.getName().equals("Fifi"); // true

}

在这个例子里面,执行完foo()方法之后,在main方法里再调用aDog.getName()方法依然会返回”Max”,在main方法中的aDog并没有因为foo()的执行而被重写,这说明了参数是按值来进行传递的。如果是按照引用来传递的话在执行完foo()方法之后aDog.getName()将会返回”Fifi”。


就像这样:

Dog aDog = new Dog("Max");

foo(aDog);

aDog.getName().equals("Fifi"); // true

public void foo(Dog d) {

d.getName().equals("Max"); // true

d.setName("Fifi");

}

回答2:


我刚刚发现你引用了我的文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值