Java中的傳遞方式有值傳遞和引用傳遞兩種方式。值傳遞,是指在方法調(diào)用的時(shí)候,將實(shí)參的值復(fù)制一份給形參,形參在方法中進(jìn)行操作,不會(huì)影響到原始的實(shí)參。Java中的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,基本數(shù)據(jù)類型都是值傳遞方式,而引用數(shù)據(jù)類型則需要更復(fù)雜的規(guī)則。
public class Test { public static void main(String[] args){ int a = 10; int b = 20; swap(a,b); System.out.println("a="+a+",b="+b); } public static void swap(int m, int n){ int temp = m; m = n; n = temp; } }
在上述代碼中,通過swap方法嘗試交換a和b兩個(gè)變量的值。運(yùn)行代碼后輸出結(jié)果會(huì)發(fā)現(xiàn),a和b的值并沒有發(fā)生改變,原因是swap方法中的m和n是基本數(shù)據(jù)類型的形參,形參在方法中進(jìn)行操作,不會(huì)影響到原始的實(shí)參。
而對(duì)于引用數(shù)據(jù)類型,假設(shè)有以下代碼:
public class Test { public static void main(String[] args){ StringBuilder str = new StringBuilder("Hello"); changeValue(str); System.out.println(str); } public static void changeValue(StringBuilder stringBuilder){ stringBuilder.append(", world!"); } }
在這段代碼中,我們定義了一個(gè)StringBuilder對(duì)象str,并通過changeValue方法來更改str對(duì)象中的值。由于StringBuilder屬于引用數(shù)據(jù)類型,因此變量str在傳遞給changeValue方法時(shí),會(huì)將str對(duì)象的引用傳遞給方法中的stringBuilder。在changeValue方法中,我們對(duì)stringBuilder進(jìn)行了append操作,此時(shí)str對(duì)象中的值也發(fā)生了改變。
從上述例子可以看出,Java中的值傳遞只是將實(shí)參的值復(fù)制一份給形參,在方法中進(jìn)行操作不會(huì)影響到原始的實(shí)參。但當(dāng)涉及到引用數(shù)據(jù)類型時(shí),由于引用的傳遞方式不同于值的傳遞方式,因此在方法中更改引用所指向的對(duì)象的值會(huì)影響到原始的實(shí)參。