Java语言中的参数传递

Java语言中的参数传递
做者:陈跃峰
 
        在实际的开发过程当中,方法调用是一种很常见的操做,在方法调用中,关于参数的处理可能不少进行实际开发的程序员都不必定理解的很清楚,下面系统的介绍一下Java语言中参数传递的规则,以及和参数传递相关的一些问题。
        和其它程序设计语言相似,Java语言的参数传递也分为两种:
一、 按值传递(by value)
适用范围:8种基本数据类型、String对象
特色:在内存中复制一份数据,把复制后的数据传递到方法内部
做用:在方法内部改变参数的值,外部数据不会跟着发生改变
二、 按址传递(by address)
适用范围:数组、除String之外的其余全部类型的对象
特色:将对象的地址传递到方法内部
做用:在方法内部修改对象的内容,外部数据也会跟着发生改变
基础示例代码:
    publicclass Test1{
    publicstatic void t1(int n){
       n = 10;
   }
    publicstatic void t2(String s){
             s = "123";
   }
    publicstatic void t3(int[] array){
       array[0] = 2;
   }
    publicstatic void main(String[] args){
         int m = 5;
       t1(m);
       System.out.println(m);
       String s1 = "abc";
       t2(s1);
       System.out.println(s1);
         int[] arr = {1,2,3,4};
       t3(arr);
       System.out.println(arr[0]);
   }   
   }
        按照上面的参数传递规则,该代码的输出结果应该是:5 abc 2。由于int类型是按值传递,因此把参数m传递到方法t1时,至关于又复制了一份m的值,在方法t1内部修改的是复制后的值,因此m的值不变,s1的输出和m相似。而arr是数组,属于按址传递,也就是把arr的地址传递到了方法t3内部,在方法t3内部修改数组中的值时,原来的内容也发生改变。
        以上特性是Java语言中的规定,在语法上没法指定参数传递是按值传递仍是按址传递,可是能够经过下面的变换实现:
一、 对于按值传递的参数,若是须要在方法调用之后修改参数的值,能够利用返回值来实现。
二、 对于按值传递的参数,若是须要在方法内部修改时原来的参数不改变,则能够在方法内部从新建立该对象实现。
示例代码以下:
public class Test2{
    publicstatic int t1(int n){
       n = 10;
       return n;
   }
    publicstatic String t2(String s){
                s = "123";
                 return  s;
   }
    publicstatic void t3(int[] array){
       //建立新的数组并赋值
       int[] newArray = new int[array.length];
       //数据拷贝
       System.arraycopy(array,0,newArray,0,array.length);
       newArray[0] = 2;
   }
    publicstatic void main(String[] args){
                int m = 5;
       //从新赋值
       m = t1(m);
       System.out.println(m);
       String s1 = "abc";
       //从新赋值
       s1 = t2(s1);
       System.out.println(s1);
                int[] arr = {1,2,3,4};
       t3(arr);
       System.out.println(arr[0]);
   }   
}
这样,程序的输出结果就将是:10 123  1
在实际的程序开发中,能够根据须要使用相似的结构来进行实现。
        下面再介绍一个参数传递的常见应用,利用参数传递实现返回值,这样的功能在IO类设计的read方法中大量使用。示例代码以下:
public class Test3{
    publicstatic void initArray(int[] array){
                for(int i = 0;i < array.length;i++){
                          array[i] = i;
       }
   }
    publicstatic void main(String[] args){
                int[] a = new int[10];
       initArray(a);
       for(int i = 0;i < a.length;i++){
                          System.out.println(a[i]);
       }
   }
}
        在该示例代码中,在initArray方法内部修改了数组的值之后,外部数组a的值也会发生改变,间接实现了返回值的效果。固然,在该示例代码中,由于只返回一个参数,因此做用体现的不明显,若是须要返回多个参数时,使用按址传递是一种不错的主意。
   因时间仓促,疏漏之处不免,请你们积极补充和指正。


已有 0 人发表留言,猛击->>这里<<-参与讨论


JavaEye推荐
相关文章
相关标签/搜索