Java值传递和引用传递的问题

java传参数的时候是值传递还是引用传递是个很有意思的问题,
一些有几年工作经验的人也会因此而困惑,
面试的时候更是经常有这样的问题,
今天我整理了一下自己对于这个问题的理解,
希望对一些还没弄清楚此问题的人有所帮助

[b]1、基本类型当参数传递的情况[/b]

/**
* 基本数据类型
*/
public static void main(String[] args) {
int i=10;
changei(i);
System.out.println(i);
}
public static void changei(int x){
x=20;
}

输入的结果是10。
原因是在进入changei(i)的时候,
会把i的值复制一份传递给方法,
方法里面的修改已经和原来i的值无关了。

[b]2、类对象当做参数传递的情况[/b]

public class BValue {
public int i=10;
public static void main(String...args){
BValue a=new BValue();
another(a);
System.out.println(a.i);
}
public static void another(BValue a){
a.i=20;
}
}

输出的结果是20,
进入another(a)方法的时候,
把a对象的引用的值当作参数传递给another方法,
another方法里面通过引用的值去修改的实际上还是a对象的内存区域,
所以方法结束后打印a.i的值是20。

[b]3、对于类对象传参扩展一下[/b]

public class AValue {
public int i=10;
public static void main(String...args){
AValue a=new AValue();
a.i=30;
another(a);
System.out.println(a.i);
}
public static void another(AValue a){
a.i=20;
AValue b=new AValue();
a=b;
System.out.println(a.i);
}
}

这个输出的结果是什么呢?
答案是:
10
20
这个有点意思了吧 :D
可以这样理解;
在调用another(a)的时候,
a.i的值还是30,
这个时候把a对象的引用复制一份,
把这个复制品传递给another方法,记住是传递的是a对象的引用的复制品,
another方法里面第一步修改a.i=20的时候,
引用的复制品指向的还是a原始的内存,
此时a.i的已经从30变成20了。
然后new了一个新对象,把a指向新的对象,
实际上是把a对象的引用的复制品指向了新对象,
而a对象的实际引用没有改变。
然后打印a.i,是10。
方法结束后打印a.i是20。
说到这里你理解了么

[b]4、对于String类型作参数传递的问题[/b]

public class TestString {
public static void main(String[] args) {
String str="hello";
change(str);
System.out.println(str);
}
public static void change(String s){
s="world";
}
}

输出结果是:
hello
String虽然不是基本类型,
但是作参数传递的情况和基本类型作参数传递类似,
因为String类的内部实现是char[],
可以把String理解为char类型的包装类(类似于int和Integer一样)
具体可以参考这篇文章:
[url]http://freej.blog.51cto.com/235241/168676[/url]

[b]ps:[/b]
有些文章上说java只有值传递,没有引用传递,
可以这样理解,当类对象作参数传递的时候传递的是引用或地址的值,
从这个角度看,确实,java只有值传递。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值