關於java中按值傳遞的疑問
看到該社區的一篇文章,java 其實是按值傳遞的, 就很疑惑,這種情況是怎麽解釋的呢?
String a="a";
String b=a
b="b"
此時a="b", 如果按值傳遞,它不是應該修改的是他的copy 嗎,爲什麽會這樣呢?
可是按引用傳遞,
public void fn1(String a){
a="aaaa"
}
public static void main(String []args){
String b="bbb";
fun1(b);
System.out.println(b);
}
打印的結果爲什麽是bbb 呢?
很疑惑,向高手請教,
還有, 能夠有什麽辦法得到返回類行爲boolean 的方法裏的integer 嗎?
问题点数:10、回复次数:10Top
1 楼UnAgain()回复于 2006-06-04 18:15:38 得分 10
传值和传引用一般指的是变量在方法之间的传递方式。
1)你的第一个问题不是传值,而是赋值。另外,a仍然是"a",不是"b"。你自己测试一下。
我要吃饭了,过会儿再给你详细解释解释Top
2 楼ousys()回复于 2006-06-04 18:42:28 得分 0
thank u , wait ur answer.Top
3 楼UnAgain()回复于 2006-06-04 19:57:24 得分 0
等会儿。
1)你的第一个问题不是传值,而是赋值。另外,a仍然是"a",不是"b"。你自己测试一下。
这个问题你测试了没有?Top
4 楼UnAgain()回复于 2006-06-04 19:59:09 得分 0
今晚有事,你明天看吧,不好意思。Top
5 楼ousys()回复于 2006-06-04 19:59:11 得分 0
這個測試了,可是在我的記憶裏好像有一個相似的是通過REFERENCE的,
謝謝,剩下的繼續說Top
6 楼UnAgain()回复于 2006-06-05 09:51:46 得分 0
正在考虑你的问题。我发现一个道理,越是基本问题越不能马虎。
我正在看langspec3.0,有兴趣你也可以看看。
待会儿给你答复。Top
7 楼uesugitatsuya(风吹那年流水)回复于 2006-06-05 10:35:20 得分 0
第二个问题,传递的是string对象一个引用的副本,而不是引用.你在函数里面更改了引用的副本,但是并不是对引用指向的对象的更改,如果你用a.append("aaa")就会发现值不一样了.Top
8 楼UnAgain()回复于 2006-06-05 13:47:20 得分 0
好了,写完了。
我另外建了一个帖子
http://community.csdn.net/Expert/TopicView1.asp?id=4801113
大家一起讨论讨论这个问题。Top
9 楼UnAgain()回复于 2006-06-05 22:09:26 得分 0
借题发挥,写了一大堆,不知道你看过来没有,不知道我写的是不是清楚?Top
10 楼UnAgain()回复于 2006-06-06 17:09:02 得分 0
先给你解释这句话的执行过程
String a="a";
首先,创建一个String对象,值为“a”。然后,再把对象“a”的引用赋值给变量a。
这就是我文章中说的,变量保持对象的引用,但不是对象。
看代码:
String a="a";
String b=a; // 把在变量a中保存的对象“a”的引用,赋值给b,即a把自己保存的对“a”的
// 引用复制给b。记住,引用本身是数值,可能是对象的入口地址。
b="b" // 又创建一个新的对象“b”,然后把对象“b”赋值给变量b
从上面你可以看到,只是改变了变量b的值,而对变量a没有任何影响,所以a仍然等于“a”
可是按引用傳遞,
public void fn1(String a){
a="aaaa"
}
public static void main(String []args){
String b="bbb";
fun1(b);
System.out.println(b);
}
调用fun1(b),变量b把自己保存的对象“b”的引用赋值给fun1的参数,即变量a。道理和上面一样。所以,a的改变,不会影响b的改变。
你再看我文章中的这个例子。
class Word {
String word;
public Word(String word){
this.word = word;
}
public void print(){
System.out.println(word);
}
public void setWord(String word){
this.word = word;
}
}
Word o1, o2;
o1 = new Word("Every Day");
o2 = o1;
o2.setWord("Every Night!");
o1.print();
这时的结果是"Every Night!"。
那么,这是改变了o1吗?从严格意义上讲,不是。因为o1只是保存对象的引用,执行之后,o1还是持有该对象的引用。所以,o1没变,变的是o1所引用的对象。
Top




