java中的值传递和引用传递

java 参数,不管是原始类型还是引用类型,传递的都是参数的副本。

如果参数类型是原始类型,那么传递的参数是这个参数的一个副本,也就是这个原始参数的值。如果在函数中改变了副本的值,是不会改变原始的值。

如果参数类型是引用类型,那么传递的参数是这个引用参数的一个副本,两个引用同时指向同一个对象的值。如果在函数中没有改变副本的地址,而是改变了

地址的值,那么函数内的改变会影响传入的参数。而如果在函数中改变了副本的地址,如new 一个,那么副本指向一个新的地址,那么传入的参数还是指向原来的地址,

所有不会改变参数的值。而如果在函数中先改变了副本的值,而后又改变了副本的地址,如new 一个,那么副本指向一个新的地址,那么传入的参数还是指向原来的地址,

但是会改变参数的值。

demo1:

 1 public class ValuePass {
 2 
 3          private static int num = 5;
 4 
 5          public static void changeValue(int n) {
 6 
 7                    n = n+2;
 8 
 9                    System.out.println("n="+n);
10 
11          }
12 
13          public static void main(String[] args) {
14 
15                    System.out.println("Before changeValue(), num="+ num);
16 
17                    changeValue(num);
18 
19                    System.out.println("After changeValue(), num="+ num);
20 
21          }
22 
23 }

demo2:

public class ReferencePass {    
    public static void changeSalary(Employ e, double raiseSalary) {
        e.setSalary(e.getSalary() + raiseSalary);
        System.out.println("e.salary="+ e.getSalary());
    }    
    public static void changeSalary2(Employ e, double raiseSalary) {
        e.setSalary(e.getSalary() + raiseSalary);
        e.setSalary(e.getSalary()+1000);
        Employ ee = new Employ();
        ee.setSalary(20000);
        e = ee;
        System.out.println("e.salary="+ e.getSalary());
        System.out.println("ee.salary="+ ee.getSalary());
    }    
    public static void main(String[] args) {
        Employ e = new Employ();
        e.setSalary(10000);
        System.out.println("Before method, e.getSalary()="+ e.getSalary());
        changeSalary(e, 1500);
        System.out.println("After method, e.getSalary()="+ e.getSalary()); 
        changeSalary2(e, 1500);
        System.out.println("After method, e.getSalary()="+ e.getSalary());
    }
}
class Employ {
    private double salary;
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }    
}

猜你喜欢

转载自www.cnblogs.com/ellen413/p/8996860.html