Java之中的值傳遞問題
其他的程序語言里面都存在值傳遞和引用傳遞兩種傳遞方式 值傳遞就是把值拷貝一次傳遞到調(diào)用的函數(shù)之中 而引用傳遞則是
但是java中只存在值傳遞,只存在值傳遞?。。?/strong>
然而我們經(jīng)??吹綄τ趯ο螅〝?shù)組,類,接口)的傳遞似乎有點像引用傳遞,可以改變對象中某個屬性的值。但是不要被這個假象所蒙蔽,實際上這個傳入函數(shù)的值是對象引用的拷貝,即傳遞的是引用的地址值,所以還是按值傳遞。
Java總是采用按值調(diào)用。方法得到的是所有參數(shù)值的一個拷貝,特別的,方法不能修改傳遞給它的任何參數(shù)變量的內(nèi)容。
方法參數(shù)共有兩種類型:
基本數(shù)據(jù)類型
對象引用
基本數(shù)據(jù)類型作為參數(shù)
public class ParamTest {
public static void main(String[] args) {
int price = 5; doubleValue(price);
System.out.print(price);
}
public static void doubleValue(int x) { x = 2 * x; }
}
output:5
執(zhí)行過程:
x被初始化為price值的一個拷貝,即5
x乘以2后等于10。但是price沒有變化,依然是5
doubleValue執(zhí)行完后,參數(shù)變量不再使用,形參被回收

對象引用作為參數(shù)
class Student {
private float score;
public Student(float score) { this.score = score; }
public void setScore(float score) { this.score = score; }
public float getScore() { return score; }
}
public class ParamTest {
public static void main(String[] args) {
Student stu = new Student(80);
raiseScore(stu);
System.out.print(stu.getScore());
}
public static void raiseScore(Student s) { s.setScore(s.getScore() + 10); }
}
output:
90.0
運行過程:
1.s拷貝了stu的值,他們兩個指向內(nèi)存之中的同一個對象
2.在raiseScore函數(shù)之中,改變了s指向的Student對象的score 但是因為s和stu指向的是內(nèi)存中的同一個地址(也就是同一個對象) 所以這樣實際上就是改變了stu的score
3.函數(shù)調(diào)用結(jié)束之后,釋放形參s。stu依舊指向原來的那個對象,但是score已經(jīng)在函數(shù)中被改變了

證明對對象是值傳遞的例子
首先編寫一個交換兩個學生的方法:
public static void swap(Student x, Student y) { Student temp = x; x = y; y = temp; }
如果java對對象是采用的是引用傳遞,那個這個方法是可以的。那么x,y對象的分數(shù)是交換的。看下面的例子:
class Student {
private float score;
public Student(float score) { this.score = score; }
public void setScore(float score) { this.score = score; }
public float getScore() { return score; }
}
public class ParamTest {
public static void main(String[] args) {
Student a = new Student(0);
Student b = new Student(100);
System.out.println("交換前:");
System.out.println("a的分數(shù):" + a.getScore() + "--- b的分數(shù):" + b.getScore());
swap(a, b);
System.out.println("交換后:");
System.out.println("a的分數(shù):" + a.getScore() + "--- b的分數(shù):" + b.getScore());
}
public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp; }
}
output:
交換前: a的分數(shù):0.0--- b的分數(shù):100.0 交換后: a的分數(shù):0.0--- b的分數(shù):100.0
運行過程:
將對象a,b的拷貝分別賦值給x,y,此時a和x指向同一對象,b和y指向同一對象
swap方法體完成x,y的的交換,此時a,b并沒有變化
方法執(zhí)行完成,x和y不再使用,a依舊指向new Student(0),b指向new Student(100)
創(chuàng)建兩個對象

進入方法體,將對象a,b的拷貝分別賦值給x,y

交換x,y的值 函數(shù)調(diào)用完成之后,x,y被回收 a 、b依舊指向原對象。
