java传引用_Java中的传值与传引用

曾经对java中传值还是传引用的问题十分困惑,而且也被问到过许多次,无论是面试,还是平时我们平时的讨论中。

在stackoverflow上面浏览时,无意中发现了跟这个问题有关的论题,于是深入地查看了,感觉获益匪浅,于是结合自己过去的经验,写了这篇博客跟大家分享。

以前我觉得是这样的,java中的基本数据类型和String是传值的,而其它的类类型的数据则是传引用的。不过现在我觉得不是这样的。

*******************************************************************************

我觉得人们对于传值还是传引用的困惑源于这样一个事实:不同的人对于“引用”的定义理解不同。具有C++背景的人认为“引用”跟C++里面的引用是同一个概念,而具体C语言背景的人则认为“引用”具有“指针”的含义,等等。java中传值还是传引用取决于“引用”的含义。

Java中的传值是这样的:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public void method1(inti){2 i++;3 System.out.println(i); //5

4 }5 public voidmethod2(String s){6 s+="a";7 System.out.println(s); //aa

8 }9

10 int i=4;11 method1(i);12 System.out.println(i); //4

13

14 String a="a";15 method2(a);16 System.out.println(s);//a

View Code

但是,在java中,总是传值的。难以理解的事实是:Java把对象当引用来传递,而这些引用则是以值的形式来传递的。即对象实参的引用在初始化方法形参的时候复制了一份实参的引用,而这个拷贝的引用同实参的引用指向同一个对象。

示例如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public voidfoo(Dog d) {2 d.getName().equals("Max"); //true

3 d = new Dog("Fifi");4 d.getName().equals("Fifi"); //true

5 }6

7 Dog aDog = new Dog("Max");8 foo(aDog);9 aDog.getName().equals("Max"); //true

View Code

示例中aDog.getName()将返回“Max”。当对象引用以值的形式来传递的时候,d在方法中并没有被覆盖。

否则的话,形如:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public voidfoo(Dog d) {2 d.getName().equals("Max"); //true

3 d.setName("Fifi");4 }5

6 Dog aDog = new Dog("Max");7 foo(aDog);8 aDog.getName().equals("Fifi"); //true

View Code

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值