1、按值傳遞是什麼
傳遞的是值的拷貝,也就是說傳遞後就互不相關了(基本數據類型和String都是這樣)。
public class Test {
private void test(int a){
a = 5;
System.out.println("test方法中的a==="+a);
}
public static void main(String[] args) {
TempTest t = new TempTest();
int a = 3;
t.test(a);//傳遞後,test方法對變量值的改變不影響這裏的a
System.out.println(”main方法中的a===”+a);
}
}
運行結果是:test方法中的a===5 main方法中的a===3
2、按引用傳遞是什麼
在方法調用時,傳遞前和傳遞後都指向同一個引用(也就是同一個內存空間)。
public class TempTest {
private void test1(A a){
a.age = 20;
System.out.println("test1方法中的age="+a.age);
}
public static void main(String[] args) {
TempTest t = new TempTest();
A a = new A();
a.age=10;
t.test1(a); //這裏傳遞的參數a就是按引用傳遞
System.out.println(”main方法中的age=”+a.age);
}
}
class A{
public int age = 0;
}
運行結果如下:test1方法中的age=20 main方法中的age=20
3、解釋
值傳遞:針對基本類型
方法調用時,實際參數把它的值傳遞給對應的形式參數,函數接收的是原始值的一個copy,此時內存中存在兩個相等的基本類型,即實際參數和形式參數,後面方法中的操作都是對形參這個值的修改,不影響實際參數的值。
String表現爲值傳遞,主要是因爲String是不可變的!如何理解不可變?我們一般說的改變一個String變量,其實並不是改變的這個String本身,而是用一個新的String去替換掉原來的,原來的String本身並沒有變。
String str1 = "old";
str1 = "new";//不是在原內存地址上修改數據,而是重新指向一個新對象,新地址。
//對String對象的任何改變都不影響到原對象,相關的任何操作都會生成新的對象
引用傳遞:
方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中相對應的形式參數,函數接收的是原始值的內存地址;在方法執行中,形參和實參內容相同,指向同一塊內存地址,方法執行中對引用的操作將會影響到實際對象。