快速搞懂值傳遞與引用傳遞

fan兒發表於2020-10-31

傳遞與引用傳遞

值傳遞

  • 基本資料型別作為引數的方法呼叫
  • 實參給形參傳遞資料的方式,直接將值複製一份給形參,實參和形參在記憶體上兩個方法中的 互相獨立的區域性變數 不涉及到引用對記憶體中的資料,修改形參不會影響實參
  • 示例:
public class test {
    public static void change(int x){
        x=100;
    }


    public static void main(String[] args) {
        int x=10;
        change(x);
        System.out.println(x);
    }
}

輸出:
10

在這裡插入圖片描述

引用傳遞

  • 在方法呼叫中,傳遞的是物件(地址)
  • 實參傳遞給形參的資料的方式,將對於堆記憶體中的引用傳遞給形參,形參和實參在記憶體就會執行堆記憶體上的同一個區域,此時修改形參就是在修改實參
  • 示例:
public class test {
    public static void change(Student student1){
        student1.age=100;
    }


    public static void main(String[] args) {
        Student student=new Student(10);
        System.out.println(student.age);
        change(student);
        System.out.println(student.age);
    }
}


class Student{
    int age;


    public Student(int age) {
        this.age = age;
    }
}


輸出:
10
100

在這裡插入圖片描述

注意

  • 基本資料型別的引數是值傳遞,引用資料型別的引數傳遞是引用(地址),本質上也是值傳遞

雷區

public class test {
    public static void change(Student student1){
        student1=new Student(20);
    }




    public static void main(String[] args) {
        Student student=new Student(10);
        System.out.println(student.age);
        change(student);
        System.out.println(student.age);
    }
}




class Student{
    int age;




    public Student(int age) {
        this.age = age;
    }
}


輸出:
10

在這裡插入圖片描述

  • 這種情況也是引用傳遞,呼叫的方法時,傳的確實是地址,但是執行的程式碼中,此時又建立了一個新的物件,則此時student1指向的地址不再是之前傳遞的地址,而是新的地址,故不會改變值。

相關文章