Java方法 传值方式

这个问题是面试的时候经常会问到的一道题吧?这次做项目的过程中,其中一个同学因为无用了,导致了一个bug,不过是在提测前啦!本来我想借着这次机会分享一下java方法传参的机制,但是经过几天的学习,了解,发现网上的博客基本上没有一篇能让人看后就清清楚楚的明白的,讲的都很囫囵吞枣。觉得要要真正把这个问题说明白还真的不是一件容易的事?要了解jvm的堆栈和堆,以及java中的引用和赋值的含义。我现在也不能清楚的讲明白,但现在应该不会误用了,就是方法调用,知道怎样做可以改变传递参数的值,怎样做是不会改变传递参数的值。下面来个小测试程序,你知道这个程序会答应出什么吗?

public class Test {
    public static void main(String[] args) {
        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer("B");
        int i = 5;
        operate(a, b, i);
        System.out.println(a + "," + b + "," + i);
    }
    public static void operate(StringBuffer x, StringBuffer y, int j) {
        x.append(y);
        y = x;
        y.append("C");
        j = 1;
    }
}
规律总结:
Java参数,不管是原始类型还是引用类型,传递的都是副本
    如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
    如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是通过地址改变改变了地址指向的值,那么在函数内的改变会影响到传入的参数。
    如果在函数中改变了副本的地址,如当执行如a=其他对象,a=new等赋值操作时,实际上是将a指向新的位置,那么函数外的原值不改变。
原文地址:https://www.cnblogs.com/wangfeixiong/p/7158442.html