public class test {
public static void stringReplace (String text)  {
     text = text.replace ('J' , 'I');
}
 
public static void bufferReplace (StringBuffer text){
     text = text.append ("C");
}
  
public static void main (String args[]){
     String textString = new String ("Java");
     StringBuffer textBuffer = new StringBuffer ("Java");
         stringReplace (textString);
     bufferReplace (textBuffer);
         System.out.println (textString + textBuffer);
     }
}
在这个题目中输出的是JavaJavaC这到底是为什么呢?如果说是因为方法是无返回值的,那也应该是JavaJava啊,要不两个都改变应该是IavaJavaC啊,怎么一个改变另外一个不改变呢?
第2个问题,
public class test1 {

     public static void add3 (Integer i){
      int val = i.intValue ( );
      val += 3;
      i = new Integer (val);
 }
 public static void main (String args[]) {
      Integer  i = new Integer (0);
  add3 (i);
      System.out.println (i.intValue ( ) );
  }}
输出是0我觉得和第一个问题应该是同一原因不知道是不是第3个问题
public class Foo {
 public static void main (String [] args)  {
             StringBuffer a = new StringBuffer ("A");
         StringBuffer b = new StringBuffer ("B");
         operate (a,b);
         System.out.println(a +","+b);
 }
static void operate(StringBuffer x, StringBuffer y)  {
     x.append(y);
     y = x;
    }
 }输出的是AB,B
但我觉得这个是不是也应该是AB,AB啊
这三个问题我的感觉好象是同一类型的,我分析半天不知道是什么原因!希望高手指点一二不胜感激
我在线等了!

解决方案 »

  1.   

    这应该是Java中的值传递问题,挺迷糊人的。
    楼主可以去我博客看下,应该对你帮助
    http://blog.csdn.net/niuniu20008/archive/2008/09/19/2953785.aspx
    另外呢 StringBuffer 的append()方法,text.append ("C"); 并没有改变原对象,只是把字符串"C"追加到原对象内字符后面而已。
      

  2.   

    看你的第三题:如果在operate操作你对象的内容,那样就在原对象中放映出来,而仅仅操作的是operate方法里入参的引用。就不再原对象中放映出来。
    x.append(y);通过.append()方法,这是操作对象的内容,x=AB了,能在原对象中放映出来。而y = x; 是直接对引用y赋值了,并不能在原对象中放映出来。
      

  3.   

    总的来说就是一个JAVA传值和传引用的问题,两个人为制造的概念很容易让人混淆。这样理解要好一样,JAVA是传值的,而传的值是指向堆中对象的地址值
    第一个问题,public static void stringReplace (String text)传的是textString的一个地址,
    然后函数里text.replace ('J' , 'I'); 之后,相当于又创建了一个新的字符串Iava,然后它的
    地址赋给text,则现在text里保存的是“Iava”的地址,改变这个地址不会影响到原字符串,而为什么
    public static void bufferReplace (StringBuffer text)这函数会影响到原字符串呢,当然这
    函数传的肯定也是地址,text = text.append ("C");这个操作执行了两个过程,第一个过程是
    text.append ("C");即通过传过来的地址调用append方法,添加后,再将地址赋给text,也即是
    说bufferReplace 方法中只写text.append ("C");,没有赋值,结果是一样的。下面两个问题和第一个问题是同一个问题,搞清楚第一个剩下的就简单了
      

  4.   

    public class test1 {     public static void add3 (Integer i[]){ 
          int val = i[0].intValue ( ); 
          val += 3; 
          i[0] = new Integer (val); 

    public static void main (String args[]) { 
          Integer[]  i = new Integer[1]; 
           i[0] =  new Integer(0);
      add3 (i); 
          System.out.println (i[0].intValue ( ) ); 
      } }
      

  5.   

    首先String和StringBuffer是有区别的,String textString = new String ("Java"); 这个语句产生了两个对象一个在堆中的[new String()]另一个是字符串池中的“Java”,并且池中的对象创建的规则是有则用已有的,这个时候就只需改变引用,没有在创建新的,比如原来字符串池中存在“a”,那么s = “a”,就仅仅是把s指向了“a”,假如没有的话就创建这个对象,而 StringBuffer textBuffer = new StringBuffer ("Java"); 仅仅产生了一个堆中的一个对象new StringBuffer ("Java");而没有字符串池中的“Java”,这是为了防止频繁修改而设计的
    然后我们来看看这个题目错在了什么地方,你的stringReplace使用了JAVA API中的replace方法,这个仅仅是你堆中的那个对象作了一个替换字符串的动作,并位改变池中的那个“Java”,当你离开了这个方法时,你的引用回来又重新指向“Java”,而StringBuffer的append操作的是就是原来的对象。
    试着理解下面的例子:看看输出的结果是什么?
    String s1 = "abc";
    s1.replace('a', 'z');
    System.out.println(s1);
    StringBuffer st = new StringBuffer("abc");
    st.replace(0, 1, "z");
    System.out.println(st);
      

  6.   

    所有的方法调用本质上都是值传递,这也就意味着方法的形参的值只是实参的一个副本,关键在于形参和实参是什么类型的(是基本类型还是对象句柄,因为如果是对象句柄,那么所传递的这个副本就是对象句柄的副本,而不是对象句柄所指向的对象的副本)
    String和Integer的本质都是一个值,如果把值比作一个仓库的话,方法就是在某块空地上(栈的临时区域)重建了一个一模一样的仓库,原来的仓库设为A,后面的仓库设为B,那么调用了方法仅仅改变B仓库的物资(比如把土豆换成了芹菜),方法执行完毕后,原来的值还是指向A仓库,虽然B改变了但并没指向它(方法执行完毕之后其实方法【方法的参数也就无效了,所以仍然指向A仓库】和方法创建的B仓库实际上是等待垃圾回收了)
    那么在什么情况下会改变原来的值呢,数组是一个典型的例子,数组的本质传入的是地址(形参复制的是句柄)。好比说如的是一个仓库的实际位置的钥匙A,现在重新配了把钥匙B,但还是指向这个仓库,那么改变B就是改变这个仓库中的东西了,等备用钥匙寿命结束(方法结束),在拿A去开仓库,这时候的仓库已经改变,比如ch[]={'c','a'},ch[]作为参数传递,当ch[0]='b'时这句话的含义是将ch所指向的内存偏移是0的内容存为“b”,也就是说ch所指的对象的内容被改变了,但是ch没有改变。
    System.out.println(a),如果a是对象的引用,那么是把a指向的对象的值输出到控制台,而不是a的值输出到控制台。
      

  7.   

    同等第三题,append方法是在操作对象本身,而=赋值则是值传递