JAVA语言调用函数传递参数到底是值传递还是引用传递
小标 2018-07-24 来源 : 阅读 720 评论 0

摘要:本文主要向大家介绍了JAVA语言调用函数传递参数到底是值传递还是引用传递,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言调用函数传递参数到底是值传递还是引用传递,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

  首先先声明一下,在Java中函数传参是值传递,不是引用传递。要弄清楚这个问题之前要先弄清楚什么是值传递,什么是引用传递。

  值传递(pass by value):是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

  引用传递(pass by reference):是指在调用函数时将实际参数的地址直接传递到函数中,这样在函数中如果对参数进行修改,将影响实际参数。

  请注意我红色标记的字,很关键。相信很多人对于是值传递还是引用传递都会有这样一种认识:在传递基本数据类型的时,是值传递,在传递引用数据类型时是引用传递。原因不过就是像下面这样的代码所表现出来的。

 

package com.wuqi.p1;

public class ValuePassTest {

 

    public static void main(String[] args) {

        int a = 1;

        //传递基本数据类型,因为是将a的值传递给param,所以即便在pass函数中改变了

        //参数的值,a的值还是不会变。所以我们认为在传递基本数据类型的时候是值传递        pass(a);

        System.out.println("a= " + a);

    }

 

    private static void pass(int param) {

        param = 2;

        System.out.println("param= " + param);

    }

 

}

 

 

 

package com.wuqi.p1;

import com.wuqi.p2.User;

public class PassTest2 {

    

    public static void main(String[] args) {

        User user = new User();

        user.setName("wutianqi");

        

        //传递对象,因为是将指向User的引用user传递给了param,

        //在函数中param.setName会反应到真实的对象中去。因此我们

        //认为在这种情况下是引用传递        pass(user);

        System.out.println("my name is " + user.getName());

    }

 

    private static void pass(User param) {

        param.setName("wuqi");

        System.out.println("my name is " + param.getName());

    }

    

}

 

 

包括我自己以前也是这么认为的。但是我们都没有注意到这样一个问题。请看代码

 

package com.wuqi.p1;

public class PassTest3 {

    public static void main(String[] args) {

        String name = "wutianqi";

        

        //这里传递字符串参数,按照我们以前的观点这里应该传递的是将指向字符串的name引用

        //传递给param,那么在pass函数中修改参数的值会直接影响到name引用指向的字符串

        //的值,那么输出的结果依此应该是 my name is wuqi  my name is wuqi        pass(name);

        System.out.println("my name is " + name);

    }

 

    private static void pass(String param) {

        param = "wuqi";

        System.out.println("my name is " + param);

        

    }

}

 

这段代码按照我们对象是引用传递的思想,输出的结果就应该是代码中所说的那样。但是真实输出的结果确实下面这样

 

 

 

哎呦!什么情况!颠覆了你的认知?当初看到这段代码我也是大吃一惊!这说明之前的认识是错的!

别慌!让我们在看一下值传递和引用传递的概念吧。这里我标红的字体起作用了。引用传递是直接传递引用,那么在函数中对参数进行修改将会影响到实际参数。按照这个理论,那么毫无疑问,通过上面的例子,引用传递对于Java函数参数传递来说是错误的。在看看值传的概念,值传递是将实际参数复制一份,对参数的改变不会影响到实际参数。注意复制这两个字!!!在上面的例子中,如果我们认为是复制了name引用,也就是复制了name引用的值,然后传递给param。param="wuqi",其实相当于param=new String("wuqi"),这时param指向了一个新的对象。而实际参数name还是指向原来的对象。这样的话输出的结果和正确的就对上了。这样也就证明了在Java中是值传递而不是引用传递。

对于对象来说传递的是引用的一个副本给参数,这一点要铭记!

以上就是职坐标整理发布关于JAVA的介绍,先祝大家对它有了一定的了解吧,了解更多内容,请关注职坐标编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程