1. 程式人生 > >JAVA值傳遞和引用傳遞

JAVA值傳遞和引用傳遞

內容 stub generated https ati [1] 數據 details 接收

JAVA值傳遞和引用傳遞

@Author: TianchiLiu

1 值傳遞和引用傳遞

  • 值傳遞:

    方法調用時,實際參數把它的值傳遞給對應的形式參數,函數接收的是原始值的一個copy,此時內存中存在兩個相等的基本類型,即實際參數和形式參數,後面方法中的操作都是對形參這個值的修改,不影響實際參數的值。


    基本類型都是值傳遞


  • 引用傳遞:


    也稱為傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方 法中相對應的形式參數,函數接收的是原始值的內存地址。在方法執行中,形參和實參內容相同,指向同一塊內存地址,方法執行中對引用的操作將會影響到實際對象。


    對象和數組是引用傳遞


    2 總結:java語言中只有值傳遞,沒有引用傳遞

  • 無論傳遞的是值本身還是地址,傳入方法的參數都是原始值的一個copy,而對這 個形式參數的操作都不會影響原本值(無論是值還是地址)
public class Test1 {
 
    static class a{
 
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i = 1;
        System.out.println("基本類型數據傳入方法前:"+i);//基本類型數據傳入方法前:1
        change(i);
        System.out.println("基本類型數據傳入方法後:"+i);//基本類型數據傳入方法後:1
        
        a a1 = new a();
        System.out.println("對象類型數據傳入方法前:"+a1);//對象類型數據傳入方法前:對象等號.Test1$a@2a139a55
        changea(a1);
        System.out.println("對象類型數據傳入方法後:"+a1);//對象類型數據傳入方法後:對象等號.Test1$a@2a139a55
        
        int shuzu[] = new int[2];
        System.out.println("數組傳入方法前:"+shuzu);//數組傳入方法前:[I@6d06d69c
        changeshuzu(shuzu);
        System.out.println("數組傳入方法後:"+shuzu);//數組傳入方法後:[I@6d06d69c
 
    }
 
    private static void changeshuzu(int[] shuzu) {
        // TODO Auto-generated method stub
        shuzu = new int[3];
        System.out.println("數組傳入方法中:"+shuzu);
    }
 
    private static void changea(a a1) {
        // TODO Auto-generated method stub
        a1 = new a();
        System.out.println("對象類型數據傳入方法中:"+a1);//對象類型數據傳入方法中:對象等號.Test1$a@15db9742
    }
 
    private static void change(int i) {
        // TODO Auto-generated method stub
        i = 100;
        System.out.println("基本類型數據傳入方法中:"+i);//基本類型數據傳入方法中:100
    }
 
}
  • 對象和數組,傳入方法的時候都是,傳入自身地址的一個copy,改變這個copy,自然不會對原來自身的地址值有變化;但是如果改變這個copy裏的值,自然會影響原來地址裏面的值
/*
 * 傳入方法之前i:15
傳入方法之後i:20
傳入方法之前數組內容:1,2,3
傳入方法之後數組內容:10,20,30*/
public class Test2 {
 
    static class b{
        int i = 15;
        
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        b b1 = new b();
        System.out.println("傳入方法之前i:"+b1.i);
        changeb(b1);
        System.out.println("傳入方法之後i:"+b1.i);
        
        int shuzu[] = {1,2,3};
        System.out.println("傳入方法之前數組內容:"+shuzu[0]+","+shuzu[1]+","+shuzu[2]);
        changeshuzu(shuzu);
        System.out.println("傳入方法之後數組內容:"+shuzu[0]+","+shuzu[1]+","+shuzu[2]);
    }
 
    private static void changeshuzu(int[] shuzu) {
        // TODO Auto-generated method stub
        shuzu[0] = 10;
        shuzu[1] = 20;
        shuzu[2] = 30;
    }
 
    private static void changeb(b b1) {
        // TODO Auto-generated method stub
        b1.i = 20;
    }
 
}
  • String ,Integer ,Double 雖然也是類,但是設計成不可變(immutable)類,可以當做傳遞值本身的值傳遞
/*
public class Test3 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String a = "a1";
        System.out.println("傳入方法前:"+a);//傳入方法前:a1
        changestring(a);
        System.out.println("傳入方法後:"+a);//傳入方法後:a1
        
        Integer a1 = 1;
        System.out.println("傳入方法前:"+a1);//傳入方法前:1
        changeInteger(a1);
        System.out.println("傳入方法後:"+a1);//傳入方法後:1
    }
    private static void changeInteger(Integer a1) {
        // TODO Auto-generated method stub
        a1 =100;
    }
    private static void changestring(String a) {
        // TODO Auto-generated method stub
        a = "a2";
    }
}

參考:obession

JAVA值傳遞和引用傳遞