1. 程式人生 > >java中的值傳遞和引用傳遞

java中的值傳遞和引用傳遞

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, 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; } }

java中的值傳遞和引用傳遞