值传递和引用传递的区别

示例代码:

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对象才会被修改。

 



原文地址:https://www.cnblogs.com/swqblog/p/13233082.html