Java是“值传递”还是“引用传递”?

本文通过一个具体的Java示例,详细解释了Java中的参数传递机制,即所谓的“值传递”。通过对比两个不同的方法,展示了如何在不改变原始对象引用的情况下修改对象的内容。

本文是根据stackoverflow网站上的一道题目整理出来的。

Java一直是“值传递”而不是引用传递。看一个例子:

public class Main{
  public static void main(String[] args){
    Foo f = new Foo("f");
    changeReference(f);  //不改变引用
    modifyReference(f);  //会修改变量f指向的对象
  }
  public static void changeReference(Foo a){
    Foo b = new Foo("b");
    a = b;
  }
  public static void modifyReference(Foo c){
    c.setAttribute("c");
  }
}

我们来一步步分析这个例子:

 

1、 声明一个类型Foo的引用f,并将其指向一个带有属性`“f”`的类型Foo的新对象。

 Foo f = new Foo("f"); 

2、方法方面,声明了一个名为a的Foo类型的引用,初始化的值为null。

 public static void changeReference(Foo a) 

3、 当你调用方法changeReference时,引用a将指向作为参数传递过来的对象。

 changeReference(f); 

4、声明一个名为b的Foo类型的引用,指向一个包含属性“b”的新Foo对象。

 Foo b = new Foo("b"); 

5、 a=b 是将引用a重新指向了含有属性“b”的对象,而不会影响引用f。

6、当你调用方法modifyReference(Foo c)时,创建引用c并将其指向含有属性“f”的对象。

7、 c.setAttribute("c") 会改变引用c所指向的对象的属性,而它与f指向的是同一个对象。

总结如下:

  1. 对象是引用就是一个变量,其中包含的数据可以告知JVM如何在内存(堆)中获得被引用的对象。
  2. 当给一个方法传递参数的时候,你传递的并不是引用变量,而且该变量的数据的拷贝,即该引用变量的值。
  3. 传递的是引用的值,而不是引用本身,更不是对象。
  4. 可以根据传递的值访问并修改对象的内容,但是不能改变原本的引用变量的指向。

 

转载于:https://www.cnblogs.com/GuoYaxiang/p/6703239.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值