public class demo{
public static void main(String[] args){
String x="hello";
change(x);
System.out.println(x);
}
static void change(String m){
m = m + 2;
}
}请问输出结果是什么?
为什么还是hello呢?
我知道String类型的对象是常量,知道当实参传递到change函数里会产生一个String对象引用的副本.
问题是:对象m会不会在常量存储区中再产生一个对象的副本.其实修改的是副本对象?
    但是既然会产生String类型的副本对象,那么也应该是常量,那么连接数字2是不是会没有效果呢?

解决方案 »

  1.   

    String对象引用的副本不就是m吗,m不会再产生副本了
      

  2.   

    不知道咋回事1!!!试了试!!!输出hello   等待高手解答
      

  3.   

    String x = "hello"和String x = new String( "hello" )
      

  4.   

    首先结果肯定是 “hello”
    m = m + 2;
    修改的是副本的对象值
      

  5.   

    你这很像脑筋急转弯啊!!!你那个函数根本就没赋值给x
    应该这样
    public class StringPrintTest 
    {
        public static void main(String[] args){
        String x="hello";
        String y=new String("hello");
        x=change(x);
        y=change(y);
        System.out.println(x);
        System.out.println(y);
        }
        static String change(String m){
            return m = m + 2;
        }
    }
      

  6.   

      这个问题其实是一个地址的问题.假设x的地址是10(打个比方),则调用方法change(x)时,x的地址10传递给了m,但是你应该注意到x和m引用的地址都一样,但是x和m分别放在不同的地址空间,就好比你和你哥哥都用同一个电视一样.在方法chang内部,只是修改了m的地址,m=12,x没有受影响,x还是10.所以x应用的内容还是"hello".
      

  7.   

    既然x和m引用的地址都一样,那么修改的对象就会影响到main函数里面,知道拨?
    你把String全部换成StringBuffer就知道了!
      

  8.   

     1. 参数传递问题 
     2. 你把change()方法设成有返回值,再试一下:
         你调用了方法没返回啊  public class demo{
        public static void main(String[] args){
        String x="hello";
        String s = change(x);
        System.out.println(s);
        }
        static String change(String m){
            return m = m + 2;
        }
    }
      

  9.   

    现在这个问题是关键:但是既然会产生String类型的副本对象,那么也应该是常量,那么连接数字2是不是会没有效果呢? 
      

  10.   

    public class demo{
        public static void main(String[] args){
        String x="hello";
        change(x);
        System.out.println(x);
        }
        static void change(String m){
            m = m + 2;
        }
    }
    我的理解是change方法改变的是局部变量m的值,m在调用完这个方法以后,引用就失效了,所以X的值还是hello。
      

  11.   

    我觉得是change没有return的问题
    你加上return m 试试
      

  12.   

     m = m + 2;
    m+2会产生一个新的String,然后m又指向这个新的String,就相当于m=new("hello2")
    ,此时的m已经不是x的副本了。
    就好比一个(名字叫x)的人通过一条线拉着一个(名字叫hello)的气球,
    然后通过x克隆一个叫m的人,m手上也拉着一条线指向(名字叫hello)的气球。  此时hello气球上有2条线。然后m这个人把他的这条线从hello气球上解下来,绑在了hello2气球上。现在问你x这个人的手里拉着那个气球,  那肯定是hello了
      

  13.   

    传的是对常量池的引用,此时他们还是指向同一常量池的地址,不信你用 == 比较一下 x 和 m ,返回是true;但是如果改变了m的值,他就回在拷贝x的值然后加上2,在常量池中分配内存,此时x 和 m 分别指向不同的内存地址了.OK 觉得好就给我分啊,不懂,MMMM 
      

  14.   

    public class demo{
        public static void main(String[] args){
        String x="hello";
        x=change(x);
        System.out.println(x);
        }
        static String change(String m){
            m = m + 2;
            return m;
        }
    }
      

  15.   

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String x="hello";
        x=change(x);
        System.out.println(x);
        
        }
    static String change(String m){
            m = m + 2;
            return m;
        }
    楼主,请看这个应该可以明白了。
      

  16.   

    论坛有专门讨论的贴  String的  可以看看~
      

  17.   


    你是指这样?
    public class Test {
        public static void main(String[] args){
        StringBuffer x= new StringBuffer("hello");
        change(x);
        System.out.println(x);
        }
        static void change(StringBuffer m){
            m.append("2");
        }
    }
      

  18.   

    ls已经分析很清楚了,改变的只是m的值,这不象c++里面有指针,可以指向地址的,尔后改变原来的值
      

  19.   

    感觉应该还是输出hello,不知道是否正确,学习中
      

  20.   

    java中永远是值传递,当你调用change方法后执行m= m + 2前,内存中是这样分布的:x-->"hello"<--m;x,m同时指向“hello”对象,传递的是对象的地址,而执行m = m + 2的时候,x-->"hello";m-->"hello2";你可以发现x所指向的对象并没有发生改变。
      

  21.   

    跑题跑到String常量池上去了?
    和String的特殊性没有任何关系,换任何对象和数值都会是这个结果.
    是java的传参方式造成的( ̄(工) ̄) public class Demo
    {
      public static void main(String[] args) 
      {
        String[] x = {"hello"};
        change(x);
        System.out.println(x[0]);
      }  static void change(String[] m) 
      {
        m[0] = m[0] + 2;
      }
    }
      

  22.   

    你想说明什么?你的程序的执行结果是
    hello2
      

  23.   

        那我只能建议你看一看有关汇编语言知识了,如果汇编语言你知道一点,你就明白怎么回事了.
        我给你说明白一点:
        main方法和chang方法在内存中有着各自的地址空间.
        在main方法里面,x引用了(引用也就是C语言中的指针)字符串 "hello",当调用方法chang(x)时,x的引用传递给m(注意:在java语言里,参数传递都是值传递,x的引用传递给m,m又引用字符串"hello"),这时x和m的地址是是不同的,只是都引用了"hello".
        在方法chang内部,m的地址已被改变,这时m引用其他的内容,但是x没有变化,还是引用"hello",所以程序的最后结果还是"hello"
      

  24.   

    给你一个修改的程序看一看public class Test
    {
    /** Main方法 */
    public static void main(String[] args)
    {
    String x = "hello";

    System.out.println(x);
    change(x);
    System.out.println(x); /** 将下面chang方法的头标志进行修改,以便将m所引用的字符串打印出来 */
    System.out.println(change(x));
    }

    /** chang方法 x的引用传递给m(并非将x所引用的字符串传递给m) */
    public static String change(String m)
    {
    return m + 2; // m所指向的字符串变为"hello2",并且返回
    }
    }
      

  25.   


    return m + 2; // m所指向的字符串变为"hello2",并且返回 感觉这种说法有点问题。