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
。
在進一步理解:
- 值傳遞的基本概念(結合示例)
- 在 Java 中,引數傳遞是值傳遞。對於基本資料型別,比如
int
,當你在main
方法中定義int a = 1
,此時a
在記憶體中有一個儲存位置,儲存的值是1
。 - 當呼叫
change(a)
時,會把a
的值(也就是1
)複製一份傳遞給change
方法中的引數a
。這就好像是做了一個克隆操作,現在change
方法中的a
和main
方法中的a
是兩個獨立的個體,只是初始值相同。如果不想辦法,把change
方法中的a
賦值給main
方法中的a
,則change
方法中的a
與main
方法中的a
無關 - 就好比你有一張寫著數字
1
的紙條(代表main
方法中的a
),當你把這個數字抄在另一張紙條上(代表傳遞給change
方法的a
),然後你在第二張紙條上修改數字為10
,第一張紙條上的數字依然是1
。
- 在 Java 中,引數傳遞是值傳遞。對於基本資料型別,比如
- 記憶體中的體現(簡單理解)
- 在記憶體中,
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;
}