值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
下面举例说明:
传值---传递基本数据类型参数

public    class           PassValue{
    static void exchange(int a, int b){//静态方法,交换a,b的值
        int temp;
        temp = a;
        a = b;
        b = temp;
    }
    public static void main(String[] args){
       int i = 10;
       int j = 100;
       System.out.println("before call: " + "i=" + i + "\t" + "j = " + j);//调用前
        exchange(i, j);                                                                    //值传递,main方法只能调用静态方法
        System.out.println("after call: " + "i=" + i + "\t" + "j = " + j);//调用后
    }
}

 

运行结果:
        before call: i = 10        j = 100
        after    call: i = 10        j = 100
说明:调用exchange(i, j)时,实际参数i,j分别把值传递给相应的形式参数a,b,在执行方法exchange()时,形式参数a,b的值的改变不影响实际参数i和j的值,i和j的值在调用前后并没改变。
引用传递---对象作为参数如果在方法中把对象(或数组)作为参数,方法调用时,参数传递的是对象的引用(地址),即在方法调用时,实际参数把对对象的引用(地址)传递给形式参数。这是实际参数与形式参数指向同一个地址,即同一个对象(数组),方法执行时,对形式参数的改变实际上就是对实际参数的改变,这个结果在调用结束后被保留了下来。

class Book{
    String name;
    private folat price;
    Book(String n,    float ){                //构造方法
        name = n;
        price = p;
    }
    static  void  change(Book a_book,    String n,    float p){    //静态方法,对象作为参数
            a_book.name = n;
            a_book.price = p;
    }
    public void output(){        //实例方法,输出对象信息
        System.out.println("name: " + name + "\t" + "price: " + price);
    }
}
 public class PassAddr{
    public static void main(String [] args){
        Book b = new Book("java2",    32.5f);
        System.out.print("before call:\t");        //调用前
        b.output();
        b.change(b,    "c++",    45.5f);            //引用传递,传递对象b的引用,修改对象b的值
        System.out.print("after call:\t");            //调用后
        b.output();
    }
}

 

运行结果:
        before    call:    name:java2        price:32.5
        after       call:    name:c++          price:45.5
说明:调用change(b,"c++",45.5f)时,对象b作为实际参数,把引用传递给相应的形式参数a_book,实际上a_book也指向同一个对象,即该对象有两个引用名:b和a_book。在执行方法change()时,对形式参数a_book操作就是对实际参数b的操作。

 

 

Java面试题:

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  

答案基本上是:值传递

说明:得出这种结论的前提必须是“参数的值就是对该对象的引用,而不是对象的内容” 

----------------------------------------------------

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法中执行形式参数值的改变不影响实际参数的值。

引用传递:也称为传地址。方法调用时,实际参数的引用(即地址,而不是参数的值)被传递给方法中相对应的形式参数,

在方法中执行对形式参数的操作实际上就是对实际参数的操作(地址操作),这样方法执行中形式参数值的改变将会影响实际参数的值。

 

值传递——基本数据类型作为参数(如:String,int)


1. public static void changeInt(int a, int b){  
2. int tmp;  
3.     tmp = a;  
4.     a = b;  
5.     b = tmp;  
6. }

参数调用:

 

1. // int类型,值传递  
2. int a = 123;  
3. int b = 456;  
4.   
5. printInt(a, b);  
6. changeInt(a, b);  
7. printInt(a, b);

执行结果:

 

a = 123; b = 456
a = 123; b = 456
----------------------------------------------------

引用传递——对象或数组作为参数(如:Person,Array)

 

    1. class Person{  
    2.     String name;  
    3. int age;  
    4.       
    5. public Person(String name, int age){  
    6. this.name = name;  
    7. this.age  = age;  
    8.     }  
    9.       
    10. public void changePerson(Person person, String name, int age){  
    11.         person.name = name;  
    12.         person.age  = age;  
    13.     }  
    14.       
    15. public void printPerson(Person person){  
    16. "name = " + person.name + "; age = " + person.age);  
    17.     }  
    18. }

    参数调用:

    1. // 对象,引用传递  
    2. Person p = new Person("张三", 20);  
    3.   
    4. p.printPerson(p);  
    5. p.changePerson(p, "李四", 30);  
    6. p.printPerson(p);

    执行结果:
    name = 张三; age = 20
    name = 李四; age = 30

     

    ----------------------------------------------------

    完整示例:

    1. package com.val_ref;  
    2.   
    3. // Person类  
    4. class Person{  
    5.     String name;  
    6. int age;  
    7.       
    8. public Person(String name, int age){  
    9. this.name = name;  
    10. this.age  = age;  
    11.     }  
    12.       
    13. public void changePerson(Person person, String name, int age){  
    14.         person.name = name;  
    15.         person.age  = age;  
    16.     }  
    17.       
    18. public void printPerson(Person person){  
    19. "name = " + person.name + "; age = " + person.age);  
    20.     }  
    21. }  
    22.   
    23. class iArray{  
    24.       
    25. public iArray(){  
    26.   
    27.     }  
    28.       
    29. public void reverseArray(int []array){  
    30. int tmp;  
    31. int len = array.length;  
    32. for(int i=0; i<len/2; i++){  
    33.             tmp = array[i];  
    34. 1-i];   
    35. 1-i] = tmp;  
    36.         }  
    37.     }  
    38.       
    39. public void printArray(int []array){  
    40.           
    41. for(int i=0; i<array.length; i++){  
    42. "  ");  
    43.         }  
    44.         System.out.println();  
    45.     }  
    46. }  
    47.   
    48.   
    49. public class testValue {  
    50.       
    51. public static void main(String []args){  
    52.   
    53. // 对象,引用传递  
    54. new Person("张三", 20);  
    55.           
    56.         p.printPerson(p);  
    57. "李四", 30);  
    58.         p.printPerson(p);  
    59.   
    60. // 对象,引用传递  
    61. int []array = new int[5];  
    62. for(int i=0; i<array.length; i++){  
    63. 1;   
    64.         }  
    65. new iArray();  
    66.         obj.printArray(array);  
    67.         obj.reverseArray(array);  
    68.         obj.printArray(array);  
    69.           
    70.           
    71. // String类型,值传递  
    72. "张三";  
    73. "李四";  
    74.   
    75.         printString(name1, name2);  
    76.         changeString(name1, name2);  
    77.         printString(name1, name2);  
    78.   
    79. // int类型,值传递  
    80. int a = 123;  
    81. int b = 456;  
    82.   
    83.         printInt(a, b);  
    84.         changeInt(a, b);  
    85.         printInt(a, b);  
    86.     }  
    87.       
    88. // String类型  
    89. public static void changeString(String name1, String name2){  
    90.         String tmpName;  
    91.         tmpName = name1;  
    92.         name1 = name2;  
    93.         name2 = tmpName;  
    94.     }  
    95.   
    96. public static void printString(String name1, String name2){  
    97. "name1 = " + name1 + "; name2 = " + name2);  
    98.     }  
    99.       
    100. // int类型  
    101. public static void changeInt(int a, int b){  
    102. int tmp;  
    103.         tmp = a;  
    104.         a = b;  
    105.         b = tmp;  
    106.     }  
    107.   
    108. public static void printInt(int a, int b){  
    109. "a = " + a + "; b = " + b);  
    110.     }  
    111. }

     

    执行结果:name = 张三; age = 20
    name = 李四; age = 30
    1  2  3  4  5  
    5  4  3  2  1  
    name1 = 张三; name2 = 李四
    name1 = 张三; name2 = 李四
    a = 123; b = 456
    a = 123; b = 456