前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 函数调用时值传递还是引用传递?

Java 函数调用时值传递还是引用传递?

作者头像
水货程序员
修改2018-12-03 16:38:34
2.9K0
修改2018-12-03 16:38:34
举报
文章被收录于专栏:javathings

这个问题争论很多,我来终结这个话题。

Java 中,所有函数调用都是值传递。

值传递:函数调用时,传递的参数不是实参本身,而是把参数复制一份,传递到函数中,传递的是一份拷贝。如果参数是基本类型/值类型,那么就是把这个类型拷贝一份传到函数中。如果参数是引用类型,那么拷贝的不是引用类型自身,而是这个引用的持有者。 引用传递:函数在调用时,传递的参数就是实参本身(C#中的 ref 就是这种模式)。


假设有一个变量 a=new object(),要传递到一个方法中,那么 a 变量会有一份拷贝,这个拷贝也指向对象 object,这个拷贝才是真正进入函数体中参与运算的变量。

通常情况下,a 的拷贝所操作的对象就是 a 指向的对象,但是当 a 的拷贝指向另外的对象,并且操作另外的对象时,那么 a 指向的对象并不会改变。

看一个例子。

代码语言:javascript
复制
public static void main(String[] args) {
        StringBuffer sb=new StringBuffer("abcde");
        changeValue(sb);
        System.out.println(sb);//abcde12345
 
        changeReference(sb);//abcde12345
        System.out.println(sb);
    }
 
    static void changeValue(StringBuffer p)
    {
        p.append("12345");
    }
 
    static void changeReference(StringBuffer p)
    {
        p=new StringBuffer("12345");
    }

调用 changeValue 时,sb 和 sb 的拷贝,都指向了 stringbuffer 对象,值为 abcde。

changeValue 方法中,p 就是 sb 的拷贝,对 stringbuffer 增加了 12345 之后,sb 的值也会改变了。

然后 p 指向另一个对象,这时候,sb 所指向的对象并没有任何改变,所以 sb 的输出还是原来的值。

总结

很多人都喜欢把引用类型的对象传入方法体,然后通过方法中的运算,改变了这个引用对象的值。因此感觉就好像是把对象传递给了方法,但是这种做法不一定总是正确的,一旦方法中的形参指向了一个新的对象,那么方法体外的对象并不会得到任何改变。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java 中,所有函数调用都是值传递。
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档