public class Test{
public static void changestr(String str){
str = "welcome";
}
public static void main(String []args)
{
String str = "1234";
changestr(str);
System.out.println(str);
}
}
输出结果为什么是 1234??求高手指点···

解决方案 »

  1.   

    这是java调用函数的基础问题,你传递参数只是一个引用。
    你在方法里做的事只是把引用给从新赋了一个新值。但是之前的引用值并没有改变。
    举个例子就是
    int a=0;int b=a;
    你在方法里使b=2;但是输出a还是0;
      

  2.   

    那既然是引用,changestr()方法在同一块地址上再次赋值,第二次赋值不会覆盖该地址原有的值吗?
      

  3.   

    Java函数传递参数时的确传递的是引用,但对于包装类型的对象传递的不是该对象自身的引用,而是对象拷贝的引用。String可以解释为是char[]的包装类型,所以也遵循该规则。
    在changestr()中得到的引用str的地址不是‘1234’的实际内存地址,而是‘1234’拷贝的内存地址。所以不管你怎么change,原‘1234’还是不变的。
      

  4.   

    java基本类型传值 对象传的是引用
    不像c/c++传指针
    要想通过一个静态方法到达交换值的目的 是不可能的
    再说String是不可变
      

  5.   

    默认是“welcome”,但是main里它赋值了,所以最后出现‘1234’
      

  6.   

    输出的就是String str = "1234"的值,跟changestr(str)没有半毛钱的关系(它在main()函数里纯粹是个干扰因素)。
      

  7.   

    字符串对象所引用的字符串不会被改变!String类的成员方法中并不存在用来改变字符串的方法!
      

  8.   

    public static void changestr(String str){
    str = "welcome";
    }
    这个的参数进来就被覆盖了,此str 非彼str。
      

  9.   

    String 是不可变的首先。而且 想通过静态方法changestr改变的str跟main里面的str根本一点关系没有。。
      

  10.   

    public class Test{
    public static void changestr(String str){
    str = "welcome";
    System.out.println(str);//加一行这个区分一下,str变量在方法里面是这个值,在方法外面,就是外面的值了
    }
    public static void main(String []args)
    {
    String str = "1234";
    changestr(str);
    System.out.println(str);
    }
    }
      

  11.   

    JAVA 中的String 是引用类型,所以……,呵呵,你懂的,如果传基本类型像int 等,结果就不一样了!
      

  12.   

    两个str是两个不同的变量啊啊 
    没什么关系 两个str
      

  13.   

    看来学过C再来学Java会碰撞出不少火花啊
      

  14.   

    你可以把str作为实例变量定义看看,结果是什么。
      

  15.   

    public static void changestr(String str){
    str = "welcome";
    }
    中的str 非main函数中的str,main函数中输出的是自己函数体中的str对象,因为其就是“1234”,故结果为“1234”,changestr函数中只是将其函数体中的str变量负值为"welcome",但没有输出,
    就是说两个函数中的不是同一个对象。
      

  16.   

    注意,static void changestr(String str){},这个方法返回类型为void, 你在main()中调用change(str),main()方法中的str="1234"还是没变,所以输出结果是 1234 
      

  17.   


    String类是final类型的,不能改。
      

  18.   

    main中的String是不可变的,把代码稍微改一下,就会输出welcome了public class Test{
    public static String changestr(String str){
    str = "welcome";
    return str;
    }
    public static void main(String []args)
    {
    String str = "1234";
    str=changestr(str);
    System.out.println(str);
    }
    }
      

  19.   

    说错了,String str="1234";str是可变的,要变成不可变必须加上final String str="1234";
    上面的都人只要不加final,说String不变都是错误的.这个问题并不是从String不可变来说明的,而是从引用上来说的,
    正如3楼所说,难道public static void main(String args[])  
    例如编译后,执行java Test 1234
    这个args[]中的程序执行的参数能够被其他方法动态更改吗?
    显然是不能的.
      

  20.   

    jf啊!这种问题lz还得认真想想吧
      

  21.   

    这个比较好理解,在调用changestr(str);方法时相当于将str引用的拷贝传入方法体并发生变化,str本身并没有发生变化,所以打印的结果还是str本身。
      

  22.   

           这个主要涉及到String类型变量的不变性,private final char value[];String类中保存值得成员是这样定义的,所以在类存堆中new出一个String对象后该对象不能再改变。
           主函数中的str与changestr(String str)中的str是两个不同的引用,当调用函数时,把主函数中str引用指向的对象赋值给changestr(String str)中的str,即是changestr(String str)中str与主函数中的str指向同一个String对象,当函数中给str赋值是,由于String类型变量的不变性所以不是去改变"1234"(String str = "1234";)这个对象而是去创建另一个新的对象“welcome”(str = "welcome";),而changestr(String str)中的str这个引用指向它,而不是主函数中的str指向它,所以会出现这样的情况。
           对于String类型变量的赋值,遵循下面的规则,java中有String pool(我估计是由于String对象的不变性,所以java中有String pool)。
           java中有两种赋值方式,一种采用字面值方式的赋值,String s = "aaa"; 查找String pool中是否存在“aaa”这个对象,如果不存在,则在String pool 中创建一个"aaa"对象,然后将String pool中这个对象的地址返回给s这个引用,这样s会指向String pool 中"aaa"这个对象。如果String pool中已经有这个“aaa”对象时java虚拟机不会创建新的对象,而是将这个对象的地址直接返回。
           另一种方式是String s = new String("aaa"); 首先在String pool 中查找有没有这个对象,如果已经有了,则不再String pool中创建了,而是在堆中创建该对象,然后返回堆中该对象的地址。如果没有,则在String pool中创建该对象,并且在堆中也创建该对象,最后返回堆中该对象的地址给s。
      

  23.   

    static方法、变量、类、被调用的时候、就直接存再内存里了、
    不像其他的非static 方法、变量、类一样、只是一个内存的引用、也就是在内存里copy一份、原值还是没变的、
      

  24.   

    建议先好好看看think in java
      

  25.   

    这类题问的好多啊,楼主去看看
    http://topic.csdn.net/u/20110621/22/e2d58ec9-94cc-406d-adb4-70e5d96f3f9a.html?18227
    一类的