刚学完c#,今天老师讲JAVA,都把我搞迷了。
        static void Main(string[] args)
        {
            string str = "123";
            string str1 = str;
            str1 = "321";
            Console.WriteLine(str);
        }
在C#中str和str1不是都指向的一个值?改变其中一个变量不是就都改变了,最后不是应该是321?
可是为什么输出123?

解决方案 »

  1.   

    确实应该123,因为在java中,str和str1是两个对象句柄,而对象句柄实际上就是两个指针(这只是一个比喻),
    str1=str的意思,是将str1和str指向同一个内存位置,但str1和str还是互相独立的,
    所以,再给str1赋值,只是改变了str1的对象指向,str是不受影响的。
      

  2.   

    o ...回头俺回去测试下。。只有基本类型是上面那样的吧。
    非基本类型应该就不是了把。。
    建议lz自己编写两个类试试测试下。
    测试下自己类之间的引用。
      

  3.   

    确实是输出123.看来LZ面向对象的思想还不够.帮你解释下吧
    在这里str指向对象"123"
    string str1 = str;这句代码的意思是,把str的地址给str1,此时,同时是str和str1指向对象"123".
    然后str1 = "321";你这里改变的是str1的地址,让str1指向"321",而str还是指向"123"的,所以输出是"123".
    明白了吗.?   自己画个图试试而且告诉LZ一点string是不可变的.  就算你调用了string类的一些方法,如果不再重新赋值的话,对象是不会改变的..Java和C#都是.Java里面有个StringBuffer是可变的  LZ可以去参阅下API 
      

  4.   


    那为什么老师给我讲的是:
    string a = "123" string b = a; b = "321";
                 栈                            堆
         a    EF0022               EF0022   321
        b    EF0022              
      

  5.   

    Java里是传值的,而且是只传值的。
      

  6.   

    因为String一种常量类型的 不可变  与一般的值类型是不太相同的