日期:2014-05-20  浏览次数:20701 次

java传参到底是传值还是传引用?
今天看了一个树结构的实现,StringBuffer无法正确显示 改成String就好了 有点疑问就写了下面的test
Java code

public class Test {
    public static void main(String []args){
        int s = 123;
        String m = "123";
        Ani a = new Ani();
        a.change(s);
        System.out.println(s);
        a.change(m);
        System.out.println(m);
        StringBuffer t= new StringBuffer("123");
        a.change(t);
        System.out.println(t);
        StringBuffer t2= new StringBuffer("123");
        a.change2(t2);
        System.out.println(t2);
    }
}

class Ani{
    public void change(int s){
        s=123456;
    }
    public void change(String m){
        m+="456";
    }
    public void change(StringBuffer t){
        t.append("456");
    }
    public void change2(StringBuffer t2){
        t2 = new StringBuffer("000");
    }
}



结果是:
Java code

123
123
123456
123



int,String 都没有因为调用方法而改变,觉得是传值。
StringBuffer t调用change改变,觉得应该是传引用。。
StringBuffer t2调用change2赋予参数新的引用,但是打印出来却没有变。
求高手解答Java到底是传值还是传引用?


------解决方案--------------------
1、 如果参数是基本数据类型(int、long等),传值。方法内部改变参数值,外部值不变。

2、 如果参数是对象类型,传地址。方法内部改变对象值,外部对象值改变。但是,如果方法内部调用new重新构建参数对象,外部对象仍然记录构造前的对象值。


------解决方案--------------------
感谢,String应该也不是基本类型,为什么change()后原值未改变?
回答 :String 不是基本类型 ,一般的String 都在常量池 中的
------解决方案--------------------
探讨

1、 如果参数是基本数据类型(int、long等),传值。方法内部改变参数值,外部值不变。

2、 如果参数是对象类型,传地址。方法内部改变对象值,外部对象值改变。但是,如果方法内部调用new重新构建参数对象,外部对象仍然记录构造前的对象值。

------解决方案--------------------
看完这个博客,楼主应该明白了
http://blog.csdn.net/niuniu20008/article/details/2953785