java與javascript關於傳參的一點體會

今天在學習的時候遇到了一個問題,JavaScript函數傳參的問題,基本類型和引用類型都是傳值!起初我找了本書看了下,上面是這麼説的,總是覺得和java的傳參方式是不同的,決定做個比較。先前我一直認為java是基本的傳值引用的傳引用,但是結果卻與我想的完全不一樣。
首先是js的示例代碼:

var obj = {a:"aaa"};
function test(obj2){
alert(obj2.a);
obj2 = {a:"bbb"};
alert(obj2.a);
}
test(obj);
alert(obj.a);

輸出的結果是aaa,bbb,aaa。obj.a沒有變化,也就是説test函數傳進去的是值,不是引用本身。
本以為java不是這樣的,會傳遞引用進入到方法中,故作了一個例子實驗下,結果出乎意料。
以下是java的代碼:

public class call {
private String s = "this is call";

public String getS() {
return s;
}

public void setS(String s) {
this.s = s;
}
}

接下來是調用上面類:

public class run {

public void testReferance(call cc){
System.out.println(cc.getS());
cc = new call();
cc.setS("this is not call");
System.out.println(cc.getS());
}


public static void main(String[] args) {
run u = new run();
call c = new call();
u.testReferance(c);
System.out.println(c.getS());
}
}

結果是:
this is call
this is not call
this is call
實參中的內容的副本給了形參,這兩個內容都指向了堆中的同一個對象,即便將形參的內容指向其他的對象,實參指向的對象也不會改變。
基本類型傳遞的的確是實實在在的“值”,而引用類型則是傳遞的是指向同一個對象的內容,從某種意義上説也是“值”,只不過不同於基本類型的是實實在在可以直接操作的值,其實爭論到底叫什麼,是沒有意義的,只要理解了內存中的變化即可。
“在棧內存裏面有兩個指向堆內存中同一個對象的引用”