Day30--值傳遞和引用傳遞

1hahahahahahahaha發表於2024-11-04

Day30--值傳遞和引用傳遞

在 Java 中,引數傳遞採用的只有值傳遞,沒有引用傳遞

值傳遞

示例:

建立一個叫change的方法,a=10;

package com.liu.oop.demo01;

//值傳遞
public class Demo04 {
    public static void main(String[] args) {
       
    }

    //返回值為空
    public static void change(int a){
        a=10;
    }
}

當不呼叫change方法的時候,定義a=1,輸出a的結果為1

package com.liu.oop.demo01;

//值傳遞
public class Demo04 {
    public static void main(String[] args) {
        int a=1;
        System.out.println(a);//1
       
    }

    //返回值為空
    public static void change(int a){
        a=10;
    }
}

當呼叫a的結果的時候,a的值還是1

package com.liu.oop.demo01;

//值傳遞
public class Demo04 {
    public static void main(String[] args) {
        int a=1;
        System.out.println(a);//1
        
        //呼叫change方法:
        change(a);
        System.out.println(a);//1
    }

    //返回值為空
    public static void change(int a){
        a=10;
    }
}

為什麼呢?

是因為返回值為void空嗎?

那就修改一下返回值

package com.liu.oop.demo01;

//值傳遞
public class Demo04 {
    public static void main(String[] args) {
        int a=1;
		change(a);
        System.out.println(a);//1
    }

    //返回值為空
    public static int change(int a){
        a=10;
        return 10;
    }

}

結果仍然為1

可見,並不是簡單的“返回值的問題”

事實上,在 Java 中,引數傳遞是值傳遞機制起主要作用,這與方法的返回值型別無關。

當把main方法中的變數a傳遞給change方法時,傳遞的是a的值(這裡是1)的副本,此時change方法內部的a就相當於一個新的區域性變數,它初始值是接收到的1

即使change方法有返回值(比如改成返回int型別並返回修改後的a的值),在沒有透過合適的方式在main方法中接收並處理這個返回值的情況下,change方法內部對其區域性變數a的操作依然不會影響到main方法中的原始變數a

在進一步理解:

  1. 值傳遞的基本概念(結合示例)
    • 在 Java 中,引數傳遞是值傳遞。對於基本資料型別,比如int,當你在main方法中定義int a = 1,此時a在記憶體中有一個儲存位置,儲存的值是1
    • 當呼叫change(a)時,會把a的值(也就是1)複製一份傳遞給change方法中的引數a。這就好像是做了一個克隆操作,現在change方法中的amain方法中的a是兩個獨立的個體,只是初始值相同。如果不想辦法,把change方法中的a賦值給main方法中的a,則change方法中的amain方法中的a無關
    • 就好比你有一張寫著數字1的紙條(代表main方法中的a),當你把這個數字抄在另一張紙條上(代表傳遞給change方法的a),然後你在第二張紙條上修改數字為10,第一張紙條上的數字依然是1
  2. 記憶體中的體現(簡單理解)
    • 在記憶體中,main方法中的變數a儲存在棧記憶體的一個位置。當呼叫change方法時,會在棧記憶體為change方法的引數a開闢一個新的空間,並且把main方法中a的值複製到這個新空間中。
    • 所以當change方法內部修改它自己的a變數時,是在修改這個新空間中的值,而不是修改main方法中a變數所在的空間的值。

準確的程式碼:

package com.liu.oop.demo01;

//值傳遞
public class Demo04 {
    public static void main(String[] args) {
        int a = 1;
        // 呼叫修改後的change方法並接收返回值
        a = change(a); //把**`change`方法中的`a`賦值給`main`方法中的`a`**
        System.out.println(a); 
    }

    // 修改為有返回值的方法
    public static int change(int a) {
        a = 10;
        return a;
    }
}

引用傳遞:

package com.liu.oop.demo01;

//引用傳遞 :物件      本質上還是值傳遞

//物件:記憶體

public class Demo05 {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);//null

        Demo05.change(person);
        System.out.println(person.name);//愛錕
    }
    public static void change(Person person){
        //“perosn是一個物件:指向的--->Perosn perosn=new Perosn();這是一個具體的人,可以改變屬性!”
        person.name="愛錕";
    }

}


//定義了一個person類,有一個屬性  :name
class Person{
    //String的預設值為null
    String name;
}

相關文章