java中的值傳遞和引用傳遞
阿新 • • 發佈:2018-05-06
raise 兩個 demo1 double class turn style chan reference
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, doubleraiseSalary) { 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; } }
java中的值傳遞和引用傳遞