值传递和引用传递的区别

Posted swqblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值传递和引用传递的区别相关的知识,希望对你有一定的参考价值。

示例代码:

public static void main(String[] args) {
        
        int b = 0;
        change(b);
        System.out.println(b);
    }
    public static void change(int a)
    {
        a = 1;
    }

结果:

技术图片

 

 为什么b的值不会被修改为1呢?
我们知道每个方法执行的时候都会在虚拟机栈中生成一个栈帧,而且这个栈帧中存储着局部变量表,操作数栈,动态链接等。

而change这个方法中的int a就保存在局部变量表中。但是对于int b来说,则保存在堆中。也就是说a和b是两个不同的东西。

而且栈帧中的int a只是堆中int b的一个副本。

技术图片

 

 示例代码:

  public static void main(String[] args) {


        StringBuffer str = new StringBuffer("hello");
        ReferencePassing(str);
        System.out.println(str);
    }


    public static  void ReferencePassing(StringBuffer sb)
    {
        sb.append(" world");
    }

结果:

技术图片

 

 显然可以看到str的值已经改变了。

同样执行ReferencePassing方法执行的时候,虚拟机栈同样会生成一个栈帧。只不过局部变量表中存放的是sb的引用地址,而这个地址指向的正是堆中的str对象。

所以堆中的str对象才会被修改。

技术图片

 

 

 


 

以上是关于值传递和引用传递的区别的主要内容,如果未能解决你的问题,请参考以下文章

值传递和引用传递(不是引用类型的传递)的区别

PHP值传递和引用传递的区别

按引用传递或按值传递指针容器之间的区别

Java引用传递?值传递?

值传递和引用传递怎么理解?

java中的值传递和引用传递有什么区别呀?