日期:2014-05-20  浏览次数:20787 次

求助: 一道简单的java程序。。。。。
public   class   TestString{
    public   static   void   link(String   a){
            a   +=   "World ";
      }
    public   static   void   main(String[]   args){
            String   a   =   "Hello ";
            link(a);
            System.out.println(a);
            a   =   a+   "   World ";
            System.out.println(a);
    }
}

程序执行的结果是:
Hello
Hello   World

既然String是不变类,
为什么执行a   =   a+   "   World ";后
a   变化了啊?

为什么是输出Hello   World,

不变类到底是怎么回事?

请高手指点一二……

谢谢



------解决方案--------------------
String 中的字符串是不可修改的

a = a+ " World "; 这句用a和world生成了一个新的String赋给了a
------解决方案--------------------
String对象的确是不可更改的,a = a+ " World ";这句生成一个新的String对象赋给a,原来的旧对象被回收。
------解决方案--------------------
a+ "World "这条语句产生了一个新的临时对象,a=a+ "World "将新的对象的引用赋给a,所以这个操作是可行的,
关于这点你可以用以下语句验证:
String a = "hello ";
String b=a;
System.out.println(a==b);//true
a = a+ " World ";
System.out.println(a==b);//false;

------解决方案--------------------
执行a = a+ " World "后,+号把两个字符串连接后赋给了a,相当于a的内存链接发生了变化,而 "hello "字符串并未发生变化
static修饰的方法的是静态方法,其是独立于对象存在的。所以在static void main静态方法中引用它是不需要申明它的一个对象的实例,而是直接引用了其方法名。
而在方法中申明的变量其的作用域仅为方法内,所以在link方法中,当把a作为参数传递后,其值并未改变。