public class abc {
public static void main(String[] args) {
String a = new String("A");
String b = new String("B");
oper(a, b);
System.out.print(a + "," + b);
} static void oper(String c, String d) {
c=c+"b";
d = c;
}
}

解决方案 »

  1.   

    我试过了,结果是A,B!LZ看错了???
      

  2.   

    String c和d只不过是具有和String a和b同样引用的新String,不是本身。另外,方法中的这些变量都是栈变量,退出了方法,垃圾回收器就会把栈变量清空了除非你把String返回出来,重新给String a和b创建新的引用。
      

  3.   

    我才学JAVA,我不知道我的回答对不对:
                你的oper函数没有改变a,b对象的指向,所以当主调函数执行的时候,oper没有产生实际结果
              我的语言组织的不好,反正这快和C语言指针那快有点象,不知道我说的明不明白
      

  4.   

    static void oper(String c, String d) {
    c=c+"b";
    d = c;
                      System.out.print("Look here "+c+ "," + d);
    }
    修改的是c,d  调用完了这个函数 c,d对象被释放掉了
      

  5.   

    弄不懂,String类型不是传的是地址吗??
    请大虾指点指点
      

  6.   

    弄不懂,String类型不是传的是地址吗??
    请大虾指点指点
    是啊,,我认为string也是传的地址,,,
      

  7.   

    String对象传递参数虽然是按引用的,不过在oper函数里面是指向另一个地址,所以原来的引用地址还是不变的。参考
    http://community.csdn.net/Expert/topic/5215/5215343.xml?temp=.1856348
      

  8.   

    http://syniii.atx03.idc800.net/bbs/dispbbs.asp?boardID=5&ID=71&page=1
    这里有我对一道题的分析,对各位的问题应该有帮助
      

  9.   

    这个例子中涉及二个问题.
    1、Java中对象进行传递是引用传递。
    2、java中String是不可变的。oper(a, b);//此时,a,c一起指向"A";b,d一起指向"B"
    c=c+"b";d = c;//因为String是不可变的,所以c和d指向新字符串“Ab”(注意是产生了新字符串),而a,b的指向仍然没变,还是原来的字符串如果想要产生你所要的那样,需要使用StringBuffer
      

  10.   

    感谢楼上,String不可变,,这就是答案,,感谢
      

  11.   

    什么值传递 ? 汗
    c,d 只不过是两个指针, 他们指向别的对象,并不影响 a,b的值啊
      

  12.   

    函数调用
    Stirng是个不可变的类啊 Effective Java...
      

  13.   

    J_NeedForSpeed(旧欢如梦) 正解
      

  14.   

    觉的他的解释不对
    Java中对象进行传递是引用传递。传的只是一个引用值;
    只有改变引用值 应用的的变量才会类的内容才会发生变化
    所以上面的问题不涉及到    sanpi828() 说的java中String是不可变的。下面证明
    public class Zlong {
        
    public static void main(String[] args) {
    StringBuffer a = new StringBuffer("A");
    StringBuffer b = new StringBuffer("B");
    oper(a, b);
    System.out.print(a + "," + b);
    } static void oper(StringBuffer c, StringBuffer d) {
    c=c.append("b");
    d = c;
    }
    }
     
    Ab,B
      

  15.   

    STRING不可变  建议用STRINGBUILDER或STRINGBUFFER
      

  16.   

    a-->内存A;
    b-->内存B;oper(c,d)--->
    a-->内存A<--c;
    b-->内存B<--d;c=c+"b";
    d = c;c+"b"在内存中生成一个新的对象 内存C<---c
    d=c d-->内存C
    最终结果 
    内存AB中数据无变化
    而ab始终指向内存ABOK
      

  17.   

    对string的+其实是新建了一个对象....
      

  18.   

    感觉就跟c语言一样吧。对形参操作不会返回的。所以就跟
    String a = new String("A");
    String b = new String("B");
    System.out.print(a + "," + b);
    一样!所以是A,B
      

  19.   

    有时候是我们自己把问题讲复杂了
    其实问题很简单,只要了解如下基本知识:
    1、变量类型
    值 变 量:用于代表存储大小确定的值
    引用变量:用于代表存储大小不定的值
    2、变量存储
    栈:分配的存储空间不可改变,在超过作用域后能够自动回收
    堆:分配的存储空间可以改变,在超过作用域后需要垃圾回收
    值 变 量:只在栈中申请一个与自己值域匹配的空间,用于存放自身的值
    引用变量:先在栈中申请一个与 CPU 寻址能力匹配的空间,用于存放一个地址值
         再在堆中申请一个存放自身实例的空间,并把这个空间的首地址放入栈中预先申请的空间
    变量名:都是程序代码中栈空间的首地址的代表,程序编译时,变量名会被替换为相对于栈首地址的偏移量
    3、方法的参数传递
    值 传 递:方法的形参申请自己的存储空间,运行时把方法调用时的实参值复制给形参的方式
    引用传递:方法的形参不申请自己的存储空间,让方法的形参与实参共享同一存储地址的方式
    4、Java的参数传递方式:值传递
    对于值参数,把实参值复制给形参,所以值参传递时形参在方法中的改变不影响实参。
    对于引用参数,也是把实参值复制给形参,只是这次复制的值是实参的栈空间中存放的值(栈中存了堆中的首地址值),也就是说:实参与形参将共用同一个堆空间。为此:
    方法中如果改变了堆空间中的内容,实参能同步改动;
    方法中如果改变了形参本身的栈中值(存放了一个新的堆空间首地址值),由于是值传递,实参是不变的在本例中
    由于对String对象的改变操作会创建一个新的实例由原变量接收,也就是在方法中String形参改变的实质上是栈中值,所以实参是不会变的