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

Java中传参和传值的区别
两段代码,思路大体是一样的但是输出结果却不同:

第一段:
Java code
public class DHCC extends Another{

    public static void diandao(int[] a)
    {    
        int l = a.length;
        int half = l/2;
        int tmp;
        
        for(int i=0;i<half;i++)
        {
            tmp = a[i];
            a[i] = a[l-i-1];
            a[l-i-1] = tmp;
        }
    }
    
    public static void main(String[] args) {
        int [] a = {1,2,3,4,5,6,7,8,9};
        diandao(a);
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
    }
}


这段代码是将一个为{1,2,3,4,5,6,7,8,9}的数组传入diandao()函数中进行倒序排列,运行以后的输出结果是9 8 7 6 5 4 3 2 1 实现了倒序;

第二段代码:

Java code
public class Another{
    public static void diandao(String str){
        str = "kkkk";
    }
    
    public static void main(String[] args){
        String str = "lllll";
        changeString(str);
        System.out.println(str);
    }
}


这段代码将一个为"lllll"的字符串传入diandao()中,输出应该是"kkkk"吧,为什么还是 "lllll" 呢?我都对这参数传递方式有点迷糊了,哪位能帮我解释一下,多谢了哦

------解决方案--------------------
Java code

public class Another{
    public static void diandao(String str){
        str = "kkkk";
    }
    
    public static void main(String[] args){
        String str = "lllll";
        changeString(str); /* 这是什么函数?写错了吧*/
        System.out.println(str);
    }
}

------解决方案--------------------
java中只有传值的方式,对于数组来说,引用和原型指向同一块内存,所以通过方法可以改变数组的值,而对于String来说,引用和原型指向不同的内存,所以改变引用并不改变原始的String的值,StringBuffer可以
------解决方案--------------------
最简单的区别办法就是:我一眼就能看出来
这段代码将一个为"lllll"的字符串传入diandao()中,输出应该是"lllll" 是引用传递,不是值传递
为什么? 传的参数是对象类型或是数据,那一定是 引用传递
说说下概念:
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值
引用传递:也称地址传递,方法调用时,实际参数的引用(地址,而不是参数值)被传递给方法中的形式参数,在方法执行
中对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数的值的改变将会影响实际参数的值。
------解决方案--------------------
引用传参和值传参(简单来说):
值传参 是将copy一份,是两个不同。
引用: 是将地址传过去, 是同一个。