迴歸基礎系列-call by value / call by reference區別與實例
這裏就要說明說明兩個概念:call by value(值傳遞)和call by reference(引用傳遞)
①什麼叫call by value(值傳遞),當往方法裏傳遞如int,double等基本類型的變量時,這就是值傳遞,到方法後,得到一個拷貝副本(形參),在方法裏對形參做任何操作都不會影響原變量。
如:
public static void test(int a,int b) {
a = a + b;
}
public static void main(String[] args) {
int a = 1, b = 2;
test(a, b);
System.out.println(a +" "+b);
}
輸出的是1 2
②什麼叫call by reference(引用傳遞),當往方法傳遞類對象時,會拷貝一個副本(形參)到方法裏,這裏的形參跟實參對象是同一地址。這裏要注意,如果用形參內部方法修改形參內容,實參會一起改變。除此之外,形參怎麼改變,實參都不會受到影響,如:
1. 調用形參內部方法進行修改:
public static void test(StringBuffer str) {
str.append(" World");
}
public static void main(String[] args) {
StringBuffer string = new StringBuffer("hello");
test(string);
System.out.println(string);
}
輸出:hello world
原因:調用形參內部方法進行修改,實參的值跟着改變。
2.不調用形參內部方法進行操作:
public static void test(StringBuffer str) {
str = new StringBuffer("hello world");
}
public static void main(String[] args) {
StringBuffer string = new StringBuffer("hello");
test(string);
System.out.println(string);
}
輸出:hello
原因:拷貝副本做任何除了本對象方法外的操作,都不影響實參。
總結一句話:
記住,無論是怎樣的傳遞,到方法內部都是拷貝副本;除非調用本身的方法,不然的話打死都不會改變就好了。