java 参数传递修改值_Java的方法参数传递是值传递还是引用传递

Java的方法参数传递是值传递还是引用传递?对于基本类型和对象来说,都会发生什么情况?

答案是Java只有值传递,因为Java只有值传递,因此在改变形参的值的时候,实参是不会因此而改变的。这一点从下面这个小程序可以很明显的看出来。

public class Main

{

public static void main(String[] args)

{

int a = 2;

Object object = new Object();

System.out.println(a + ":" + object);

change(a, object);

System.out.println(a + ":" + object);

}

public static void change(int a,Object object){

a = 1;

object = new Object();

}

}

我们在方法当中改变形参的值,之后再次输出两个实参的值,会发现它们无任何变化。

这就足以说明Java只有值传递了,无论是对象还是基本类型,改变形参的值不会反应到实参上面去,这也正是值传递的奥义所在。

对于基本类型来说,这一点比较明显,不过对于对象来讲,很多猿友会有误解。认为我们在方法里改变形参对象属性的值,是会反映到实参上面去的,因此部分猿友认为这就是引用传递。

首先LZ要强调的是,上面也说了,我们只是改变形参对象属性的值,反映到实参上面去的,而不是真的改变了实参的值,也就是说实参引用的对象依然是原来的对象,只不过对象里的属性值改变了而已。

针对上面这一点,我们使用下面这个程序来说明。

public class Main

{

public static void main(String[] args)

{

int a = 2;

Entity entity = new Entity();

entity.a = 100;

System.out.println(a + ":" + entity);

System.out.println(entity.a);

change(a, entity);

System.out.println(a + ":" + entity);

System.out.println(entity.a);

}

public static void change(int a,Entity entity){

a = 1;

entity.a = 200;

}

}

class Entity{

int a;

}

我们在方法里改变了entity对象的属性值为200,我们来看一下结果。

可以看到,实参对象的值依然没有改变,只是属性值变了而已,因此这依旧是值传递的范围。为了说明这个区别,我们来看下真正的引用传递。由于Java当中不存在引用传递,因此LZ借用C/C++来让各位看下真正的引用传递是什么效果。

#include

class Entity{

public:

int a;

Entity(){};

};

void change(int &a,Entity *&entity);

int main(){

int a = 2;

Entity *entity = new Entity();

printf("%d:%p\n",a,entity);

change(a, entity);

printf("%d:%p\n",a,entity);

}

void change(int &a,Entity *&entity){

a = 1;

entity = new Entity();

}

尽量保持和Java的第一个程序是一样的结构,只不过C/C++中没有现成的Object对象,因此这里使用Entity对象代替,这样便于各位理解。我们来看下结果,结果会发现引用传递的时候,在方法里改变形参的值会直接反应到实参上面去。

原文作者(左潇龙)链接:https://blog.csdn.net/zuoxiaolong8810/article/details/65441606

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值