对应关系:
name0 ---> killer
name1 ---> miller
执行public static void swap(String name0,String name1)
temp ---> killer
name0 ---> miller
name1 ---> killer
所以打印出miller,killer
name0 ---> killer
name1 ---> miller
执行public static void swap(String name0,String name1)
temp ---> killer
name0 ---> miller
name1 ---> killer
所以打印出miller,killer
你不要把Java的参数传递那么生硬地理解
其实争论JAVA到底是传值还是传参的问题恐怕没有什么统一的意见。
可以理解为Java就是传值,
你可以将定义的变量看作是指向String对象的指针,
String对象是不能改变的,能改变的是变量(指针)指向另外一个
String对象!
至于说传引用就是说生成另外一个新指针,指向同一个对象,而不是
拷贝这个对象。“String没有被交换”,是因为swap中只交换了新指针指向
的对象,而不会影响原来的变量指向,所以String没有被交换.
killer miller
miller killer
public static void swap(String name0,String name1) {
18. String temp;
19. temp=name0;
20. name0=name1;
21. name1=temp;
22. }
23. } // end of Class Note
只改变了参数值,name0,name1,而main方法中的name0,name1的值没有改变,哈哈,骗局呀,
应该是:
Killer,MillerMiller,Killer
Miller,Killer
我试了一下
输出为:
Killer,Miller
Miller,Killer顶楼兄弟请注意:
String s;
s = "Killer"; //相当于:s = new String("Killer");所以在你的swap(String, String)中,你修改了参数的引用的值,
这种修改是徒劳的。
而在swap(String[])中,你传了一个数组的引用,你并没有修改
这个引用,而是通过这个引用修改了数组的内容,所以修改有效!懂了吧?记得加分
但是第二个数组为什么没有交换,确实比较不懂
不过我想,这参考一下java的语法书应该可以解决吧
好像有些明白了,但还有个问题,如果我要用这个函数实现交换功能,该怎么写呢??
一定加分!
Killer,Miller
Miller,Killer
你到底知不知道什么叫引用?什么“引用是具有强安全性的指针”?拜托,java里面没有指针。你受C++影响太大了。如果你一定要说这是指针,他也只是“指针”的副本。我记的一本书上这样来描述引用,非常经典,“引用是指向真实数据的第二个地址”。
还有对象传的都是引用,不可能传值的。
如果有C++的基础,可能总是想把Java往以前C++的概念上套,实际上Java的确是没有指针这个概念的(这也是Java的优点之一)
“对于基本类型是按值传递,而对象是按引用传递“
其实对于对象而言,它的值就是对象的地址,所以说”传值“是这个意思。不好意思我有一段时间没有碰Java了,现在想再捡起来
所以昨天没有自己实验一下就妄自作出了结论。
向诸位好好学习。
而且告诉你,对象传的是引用没错,但是底层机制在将引用传给method的时候,传递的是value,不然你怎么解释传了引用(对象地址或句柄)本身,而在修改了引用后,原来的value并没有发生任何变化?你可以自己调试一下,不要老是引用别人的话,那样对你一点好处都没有。如果你愿意可以看看call stack的实现机制,看看javaVMd的实现原理,你就会明白了。还有,不要老是钻在某一门语言里不出来,多看看底层的,共性的东西,看看这些你才能明白什么是本质。
你知道为什么数组传递的是第一个元素的引用而不是整个数组么?知道数组下标的实现机制么?知道为什么数组能直接修改元素值,而不是修改引用?我到想看看你怎么自圆其说。如果你知道了java的数组实现机制,你再给我将将java为什么不直接支持二维数组,而要用嵌套数组来间接实现?如果这你也懂,那么你再给我将将STL里的数组是怎么实现和类型、平台无关的?
我不是反对争论,而是不要在字眼上去争论罢了,因为实际上都是一样的意思。
你说的不错,我的确没有系统地学过编程语言,Java也是自己学了一段时间,后来忙别的就忘了不少。
如果大家都是高手去理解所谓底层的东西当然不错,但是对于大多数初学或刚入门没有太多经验的人来说去理解什么底层的东西只能越来越糊涂。
听你说到数组下标的实现机制,我倒是非常想了解一下
而且STL是什么我也没听说过。
请你简短地说说我也学习一下。补充一点:虽然我根本不能和高手相比,甚至称不上程序员,但是我也很热爱学习Java,XML,我刚来这里2天,感觉这儿的气氛很不错,想向大家多学一些。
觉得你很高深,可否将你的问题解释一下,我很想学习。
莫把无知当深沉。你现在最大的困惑不就是为什么传了引用,而值不变对么?
听好了。调 swap(String name0,String name1) 的时候传了引用,而
String temp;
temp=name0;
name0=name1;
name1=temp;
这一系列操作只是把name0,name1的引用互相交换,注意交换的是引用,就好比把你说的“指针”重新定向,而这个交换不会影响原来的对象,这就是java和C最大的不同。“交换引用不会影响原来的对象”,因此我不会把引用称为指针,英雄,明白了?
如果你认为我讲的还不够“底层”,那么你看看这个例子:
Button btn;
btn = new Button(“Pink”);
replacer(btn);
System.out.println(btn.getLabel()); public void replacer(Button replaceMe) {
replaceMe = new Button(“Blue”);
}
打出的不是“blue”,而是“pink”.如果你还是不明白的话,请打110.P.S:你问的问题,我在上大学的时候考试考过N次了,如果你实在不懂,我可以给你讲讲(如果你给的分比较合理的话)。
killer miller
miller killer
原因如下:
public static void swap(String name[])
name[] ->name[0],name[1]
java在传递参数时,先分配一片内存,创建一个临时的参数变量,namep[],并将name[]的值赋予它.实际是将name[]的数组指针->namep[].namep[]和name[]的元素指向的是同一String值.
name namep
------- ------
name[0]|-> {Killer} <-- namep[0]
name[1]|-> {Miller} <-- namep[1]
进行交换操作时,交换的是namep[0]和namep[1]的内容.即交换killer,miller.也就交换了name[0]和name[1]的值.
而:
public static void swap(String name0,String name1)
参数传递时:Java复制name0和name1的值到临时参数namep0,namep1.
name0(Killer) namep0(Killer)
name1(Miller) namep1(Miller)
进行交换操作时,交换namep0和namep1的值,但是name0和name1的值不会被修改.
killer miller
miller killer
原因如下:
public static void swap(String name[])
name[] ->name[0],name[1]
java在传递参数时,先分配一片内存,创建一个临时的参数变量,namep[],并将name[]的值赋予它.实际是将name[]的数组指针->namep[].namep[]和name[]的元素指向的是同一String值.
name namep
------- ------
name[0]|-> {Killer} <-- namep[0]
name[1]|-> {Miller} <-- namep[1]
进行交换操作时,交换的是namep[0]和namep[1]的内容.即交换killer,miller.也就交换了name[0]和name[1]的值.
而:
public static void swap(String name0,String name1)
参数传递时:Java复制name0和name1的值到临时参数namep0,namep1.
name0(Killer) namep0(Killer)
name1(Miller) namep1(Miller)
进行交换操作时,交换namep0和namep1的值,但是name0和name1的值不会被修改.
STL是c++基础上的标准模版库,用于泛型编程(GP)中,我说这个的意思是,不要老是盯着OO,觉得自己是很神圣的捍卫者,应该多往前看,多学习本质的,与语言无关的东西。
to Hikaru:你不用告诉我什么,我自然知道是copy,要不然我怎么说你说的话不明不白有误导之嫌?还有,不管你是什么学校的,我问你的问题,你绝对不可能在学校考过,何况是N次?当然这么说话是有点过激,不过道理是实实在在的吧?
另外,如果我有言语冒犯,在此向你们致歉,本来我就没有吵架的意思。
“对象的引用在作为参数传递给方法的时候,它只是简单的传值,也就是说copy了一份给方法(这种情况和c++中一样),所以在swap中,两值交换不影响实际name0和name1。而数组确实传的是引用,故你改变的是引用,而不是它的值。”
“对象传的是引用没错,但是底层机制在将引用传给method的时候,传递的是value,不然你怎么解释传了引用(对象地址或句柄)本身,而在修改了引用后,原来的value并没有发生任何变化?你可以自己调试一下,不要老是引用别人的话,那样对你一点好处都没有。”
我上面的解释都是针对这两段话的,你后面的话我太长了我也没有仔细看。
我想说,为了你这句话,我特地找了那个例子来试试的,xhh(霹雳游侠)说的确实是对的。
再看看你自己吧,第一次说传值,第二次说传引用,且在解释不通的时候,得出了“对象传的是引用没错,但是底层机制在将引用传给method的时候,传递的是value”的结论,这就是你对底层理解的结果么?还是你对底层理解了但你不会表达?我倒是很想问问你这种“底层机制”到底是什么,你又深究出什么了?不过,你既然想沉默了,那我也不说废话了。
P.S:指针的概念你说的很对,你一定要把引用说成“强安全性的指针”也对,因为你了解C,但如果对于一个从来没有学过C的人或是学的不好的人,你和他这样说,或许会有点困扰。我学的不好,所以我不想困扰。
我一开始正是因为霹雳先生没有说明白和正确我才出来解释的,请你理解,谢谢。
我还真想骂你了!~
老兄。
在VC++中:
void swap(CString* str1, CString* str2){
CString* strTemp = str1;
str1 = str2;
str2 = strTemp;
}它能真正实现两个CString的交换吗?
真是受不了你,不要在自己为高手了吧,拜托~
我可不想装什么高手,倒是阁下有点自以为是吧?