对应关系:
name0  --->  killer
name1  --->  miller
执行public static void swap(String name0,String name1)
temp   --->  killer
name0  --->  miller
name1  --->  killer
所以打印出miller,killer

解决方案 »

  1.   

    我说的还不清楚吗?
    你不要把Java的参数传递那么生硬地理解
    其实争论JAVA到底是传值还是传参的问题恐怕没有什么统一的意见。
    可以理解为Java就是传值,
      

  2.   

    "对象在方法里是传引用的,为什么String没有被交换呢?"
    你可以将定义的变量看作是指向String对象的指针,
    String对象是不能改变的,能改变的是变量(指针)指向另外一个
    String对象!
       至于说传引用就是说生成另外一个新指针,指向同一个对象,而不是
    拷贝这个对象。“String没有被交换”,是因为swap中只交换了新指针指向
    的对象,而不会影响原来的变量指向,所以String没有被交换.
      

  3.   

    我觉得是:
    killer miller
    miller killer
      

  4.   

    哈哈,
     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的值没有改变,哈哈,骗局呀,
      

  5.   

    to beili_lanlan():你好象在误导吧?
      

  6.   

    不用想了,你答案错了~
    应该是:
    Killer,MillerMiller,Killer
      

  7.   

    答案是:Killer,Miller
           Miller,Killer
      

  8.   

    同意:alexzhou(alex)
    我试了一下
    输出为:
    Killer,Miller
    Miller,Killer顶楼兄弟请注意:
    String s;
    s = "Killer"; //相当于:s = new String("Killer");所以在你的swap(String, String)中,你修改了参数的引用的值,
    这种修改是徒劳的。
    而在swap(String[])中,你传了一个数组的引用,你并没有修改
    这个引用,而是通过这个引用修改了数组的内容,所以修改有效!懂了吧?记得加分
      

  9.   

    第一个对于String的传值倒是好理解,因为java是传引用
    但是第二个数组为什么没有交换,确实比较不懂
    不过我想,这参考一下java的语法书应该可以解决吧
      

  10.   

    xhh(霹雳游侠)的解释很经典,加分。
      

  11.   

    谢谢各位和xhh(霹雳游侠)
    好像有些明白了,但还有个问题,如果我要用这个函数实现交换功能,该怎么写呢??
    一定加分!
      

  12.   

    to 霹雳游侠:你说的不对,引用是对象的句柄和名字,名字变了,你说它所指代的人还一样么?怎么可能出现引用改变而对变却不变的情况?实际情况是,引用是具有强安全性的指针,除了附值给合适的对象以外,引用值不能创建和改变,因为它本身是一个基本实体,故也不能直接察看它。这道scjp题目答案发生的原因是:对象的引用在作为参数传递给方法的时候,它只是简单的传值,也就是说copy了一份给方法(这种情况和c++中一样),所以在swap中,两值交换不影响实际name0和name1。而数组确实传的是引用,故你改变的是引用,而不是它的值。所以说,你说的恰恰相反了。
      

  13.   

    to 霹雳游侠:你说的不对,引用是对象的句柄和名字,名字变了,你说它所指代的人还一样么?怎么可能出现引用改变而对象却不变的情况?实际情况是,引用是具有强安全性的指针,除了附值给合适的对象以外,引用值不能创建和改变,因为它本身是一个基本实体,故也不能直接察看它。这道scjp题目答案发生的原因是:对象的引用在作为参数传递给方法的时候,它只是简单的传值,也就是说copy了一份给方法(这种情况和c++中一样),所以在swap中,两值交换不影响实际name0和name1。而数组确实传的是引用,故你改变的是引用,而不是它的值。所以说,你说的恰恰相反了。
      

  14.   

    经过我的测试结论是:
    Killer,Miller
    Miller,Killer
      

  15.   

    to  javalearner照你的说法,是不是要把数组和一般对象区别开?为什么?
    你到底知不知道什么叫引用?什么“引用是具有强安全性的指针”?拜托,java里面没有指针。你受C++影响太大了。如果你一定要说这是指针,他也只是“指针”的副本。我记的一本书上这样来描述引用,非常经典,“引用是指向真实数据的第二个地址”。
    还有对象传的都是引用,不可能传值的。
      

  16.   

    建议大家都去翻翻thinking in java的书,我清楚地记得里面写着老外也对这个问题争论不休,所以我们今天在这里也不能争出传值还是传引用的什么结论性东西。其实争论是没有什么意义的。
    如果有C++的基础,可能总是想把Java往以前C++的概念上套,实际上Java的确是没有指针这个概念的(这也是Java的优点之一)
    “对于基本类型是按值传递,而对象是按引用传递“
    其实对于对象而言,它的值就是对象的地址,所以说”传值“是这个意思。不好意思我有一段时间没有碰Java了,现在想再捡起来
    所以昨天没有自己实验一下就妄自作出了结论。
    向诸位好好学习。
      

  17.   

    to Hikaru:不是将数组和一般对象分开,而是要搞清楚引用的本质,它和指针是同样的东西,都是地址,但是c++中指针可以被你直接察看和修改,也就是说在你改变了本来指向A的指针使得它指向B时,c++的实现机制是不会检查类型相容性的,java的创始人gosling正是看到了这一缺陷,才在java中对指针进行了严格的定义,不允许直接察看和修改指针本身,不允许类型不匹配,指针自动析值,这些都由java语言本身的机制完成,不用你操心,同时给这种指针起名为“reference”,你仅仅从名字上将两者区分开,就以为自己真真的区分开了么?恰恰相反,你自己引用的别人的话里也称“引用”为“地址”,可见我的话没有错,对吧?
    而且告诉你,对象传的是引用没错,但是底层机制在将引用传给method的时候,传递的是value,不然你怎么解释传了引用(对象地址或句柄)本身,而在修改了引用后,原来的value并没有发生任何变化?你可以自己调试一下,不要老是引用别人的话,那样对你一点好处都没有。如果你愿意可以看看call stack的实现机制,看看javaVMd的实现原理,你就会明白了。还有,不要老是钻在某一门语言里不出来,多看看底层的,共性的东西,看看这些你才能明白什么是本质。
      

  18.   

    to beli_lanlan:争论是提高自身水平的手段,如果你什么问题都看外国人,他们没有结论我们就瞪着眼睛看着,哈哈,不过那到是中国人一贯的作风。引用和指针的关系,不是什么把java往c++上面套的问题,明明是紧密相关(但不是相同)的东西,只不过名字不同,就偏要极端的强调两者是浑身不搭界的,是不是有失偏颇?不知道你是学什么出身,学计算机的应该明白,不论什么高级语言都是建立在汇编的基础上,建立在冯诺伊曼体系的计算机上的,都是通过cpu寻址执行指令和查找数据的,不可能脱离出来,自己占山为王的,对吧?那么,你为什么不看看引用和指针的最终实现呢?看了我想你就不会在这里和我说什么“翻翻Thinking in java(这本书是初学者看的,别搞错了Bruce的初衷)”了,这么说你满意么,清楚么?如果你还有什么疑问,我们可以继续讨论下去,我倒是觉得蛮有意思的。
      

  19.   

    to Hikaru:
    你知道为什么数组传递的是第一个元素的引用而不是整个数组么?知道数组下标的实现机制么?知道为什么数组能直接修改元素值,而不是修改引用?我到想看看你怎么自圆其说。如果你知道了java的数组实现机制,你再给我将将java为什么不直接支持二维数组,而要用嵌套数组来间接实现?如果这你也懂,那么你再给我将将STL里的数组是怎么实现和类型、平台无关的?
      

  20.   

    To javalearner
    我不是反对争论,而是不要在字眼上去争论罢了,因为实际上都是一样的意思。
    你说的不错,我的确没有系统地学过编程语言,Java也是自己学了一段时间,后来忙别的就忘了不少。
    如果大家都是高手去理解所谓底层的东西当然不错,但是对于大多数初学或刚入门没有太多经验的人来说去理解什么底层的东西只能越来越糊涂。
    听你说到数组下标的实现机制,我倒是非常想了解一下
    而且STL是什么我也没听说过。
    请你简短地说说我也学习一下。补充一点:虽然我根本不能和高手相比,甚至称不上程序员,但是我也很热爱学习Java,XML,我刚来这里2天,感觉这儿的气氛很不错,想向大家多学一些。
      

  21.   

    To javalearner
    觉得你很高深,可否将你的问题解释一下,我很想学习。
      

  22.   

    To javalearner
    莫把无知当深沉。你现在最大的困惑不就是为什么传了引用,而值不变对么?
    听好了。调 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次了,如果你实在不懂,我可以给你讲讲(如果你给的分比较合理的话)。
      

  23.   

    "引用是指向真实数据的第二个地址"的意思就是说引用是一个copy,我说它经典是因为我理解它的意思。你不可能单从这句话去理解什么是引用,它只是总结。
      

  24.   

    我看《An introduce to OOP with java》里面说到参数的传递是pass-by-value,传递String就是传递给参数该字符串的值,而传递数组就是传递地址。所以就是得到那样的结果啦。我是这么理解的。不知道对不对呢~!
      

  25.   

    我觉得是答案是:
    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的值不会被修改.
      

  26.   

    我觉得是答案是:
    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的值不会被修改.
      

  27.   

    to belli_lanlan():你说得没错,我们不应该在字面上争论,这句话我一向赞同,我之所以花那么多时间来解释这个问题,不是想炫耀什么,我只是觉得前面几个初学者真是太没有探索精神了,明明Hikaru讲的不明不白的,确在鼓掌欢呼,实在看不过去,便出来说两句,也没有和Hikaru过不去的意思。你问我STL是什么?
    STL是c++基础上的标准模版库,用于泛型编程(GP)中,我说这个的意思是,不要老是盯着OO,觉得自己是很神圣的捍卫者,应该多往前看,多学习本质的,与语言无关的东西。
    to Hikaru:你不用告诉我什么,我自然知道是copy,要不然我怎么说你说的话不明不白有误导之嫌?还有,不管你是什么学校的,我问你的问题,你绝对不可能在学校考过,何况是N次?当然这么说话是有点过激,不过道理是实实在在的吧?
    另外,如果我有言语冒犯,在此向你们致歉,本来我就没有吵架的意思。
      

  28.   

    to seedlyfx():你说得才是正解。
      

  29.   

    to Hikaru:你想想你说的话是多么肤浅,交换引用不影响对象,你得出的结论就是这是java和c的不同,你说了“为什么“了么?自然是没有,你只是简单的告诉别人这是两者的不同,可是人家问你的是“为什么”不同啊!大哥!“为什么”我告诉你了,你却不肯听啊。“引用是自动析值的指针,是受限制的指针,两者本质上都是内存地址,只不过存放的内容都是其它的内存地址罢了”你却一再强调两者表面的不同,对吧?我很怀疑你是不是学好了计算机组成原理,学好了系统结构?如果你一定要坚持你的错误观点,那么我保持沉默,只要别的初学者能从我们的争论中受益我就很感到欣慰了。
      

  30.   

    to javalearner()
    “对象的引用在作为参数传递给方法的时候,它只是简单的传值,也就是说copy了一份给方法(这种情况和c++中一样),所以在swap中,两值交换不影响实际name0和name1。而数组确实传的是引用,故你改变的是引用,而不是它的值。”
    “对象传的是引用没错,但是底层机制在将引用传给method的时候,传递的是value,不然你怎么解释传了引用(对象地址或句柄)本身,而在修改了引用后,原来的value并没有发生任何变化?你可以自己调试一下,不要老是引用别人的话,那样对你一点好处都没有。”
    我上面的解释都是针对这两段话的,你后面的话我太长了我也没有仔细看。
    我想说,为了你这句话,我特地找了那个例子来试试的,xhh(霹雳游侠)说的确实是对的。
    再看看你自己吧,第一次说传值,第二次说传引用,且在解释不通的时候,得出了“对象传的是引用没错,但是底层机制在将引用传给method的时候,传递的是value”的结论,这就是你对底层理解的结果么?还是你对底层理解了但你不会表达?我倒是很想问问你这种“底层机制”到底是什么,你又深究出什么了?不过,你既然想沉默了,那我也不说废话了。
    P.S:指针的概念你说的很对,你一定要把引用说成“强安全性的指针”也对,因为你了解C,但如果对于一个从来没有学过C的人或是学的不好的人,你和他这样说,或许会有点困扰。我学的不好,所以我不想困扰。
      

  31.   

    to Hiraku:好啦,我们已经背离了初衷了,我没有强调对象在传递给method()时时pass-by-value,这是我没做好的一点,我承认,可是我说传值和传引用都是有前提的,千万别断章取义,你可能以为我c学的好,其实不是,我直接学的就是c++和OO,面向过程的编程恐怕我就是学的汇编了(其实用汇编也可以实现初步的数据封装等初级OO),所以我从来不提c,对不熟悉的事物我从来不敢乱说。
    我一开始正是因为霹雳先生没有说明白和正确我才出来解释的,请你理解,谢谢。
      

  32.   

    To javalearner:
    我还真想骂你了!~
    老兄。
    在VC++中:
    void swap(CString* str1, CString* str2){
       CString* strTemp = str1;
       str1 = str2;
       str2 = strTemp;
    }它能真正实现两个CString的交换吗?
    真是受不了你,不要在自己为高手了吧,拜托~
      

  33.   

    你说得没错,没有效果的原因正是因为你传的是pointer的copy到函数堆栈中造成的,如果你传的是地址的引用(reference),不就可以解决了么?c++正是通过这种方式来实现return多值的么?如果你说传引用不改变值,会对么?java正是担心出现这个问题,才让指针自动析值的(即c++的后一种情况),对吧?
    我可不想装什么高手,倒是阁下有点自以为是吧?