java中值传递和引用传递

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

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 + "	" + "j = " + j);//调用前
        exchange(i, j);                                                                    //值传递,main方法只能调用静态方法
        System.out.println("after call: " + "i=" + i + "	" + "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 + "	" + "price: " + price);
    }
}
 public class PassAddr{
    public static void main(String [] args){
        Book b = new Book("java2",    32.5f);
        System.out.print("before call:	");        //调用前
        b.output();
        b.change(b,    "c++",    45.5f);            //引用传递,传递对象b的引用,修改对象b的值
        System.out.print("after call:	");            //调用后
        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.         System.out.println("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.         System.out.println("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.             array[i]= array[len-1-i];   
  35.             array[len-1-i] = tmp;  
  36.         }  
  37.     }  
  38.       
  39.     public void printArray(int []array){  
  40.           
  41.         for(int i=0; i<array.length; i++){  
  42.             System.out.print(array[i] + "  ");  
  43.         }  
  44.         System.out.println();  
  45.     }  
  46. }  
  47.   
  48.   
  49. public class testValue {  
  50.       
  51.     public static void main(String []args){  
  52.   
  53.         // 对象,引用传递  
  54.         Person p = new Person("张三", 20);  
  55.           
  56.         p.printPerson(p);  
  57.         p.changePerson(p, "李四", 30);  
  58.         p.printPerson(p);  
  59.   
  60.         // 对象,引用传递  
  61.         int []array = new int[5];  
  62.         for(int i=0; i<array.length; i++){  
  63.             array[i] = i+1;   
  64.         }  
  65.         iArray obj = new iArray();  
  66.         obj.printArray(array);  
  67.         obj.reverseArray(array);  
  68.         obj.printArray(array);  
  69.           
  70.           
  71.         // String类型,值传递  
  72.         String name1 = "张三";  
  73.         String name2 = "李四";  
  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.         System.out.println("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.         System.out.println("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

推荐参考:

java中的值传递和引用传递

Java 是值传递还是引用传递

java参数传递时到底是值传递还是引用传递

Java 的==和Equals比较

原文地址:https://www.cnblogs.com/shininguang/p/4776037.html