b=a 实际上是把a的地址给了b.

解决方案 »

  1.   

    String不过就是一个类而已,只是这个类用到的地方比较多,其实也不能说有什么很特别的地方。String a = "aaaaa";String c=new String(a);
    //这样的操作由于调用了new String即构造函数会创建一个新的对象出来String b=a; //无论是不是String对象,这样的赋值操作没有创建一个新的对象出来,只是令到b a指向同一个对象
    String d = "aaaaa";
    //由于JVM的优化操作,会在编译或运行的时候自动令到所有同一个类中的"aaaaa"指向同一个对象
    所以会可能令到a == d
    String其实本质上就是一个普通的类,仅仅是JVM会针对它作一些优化罢了
      

  2.   

    String a="aaaaa"; //->首先在常量池中查找是否有一个"aaaaa"的字符串,如果有则将该字串
                          的地址赋给a;若没有则在常量池中新建一个"aaaaa"的字符串,然后将
                          地址赋给a.
    String b=a;//->b中的地址=a的地址.b与a引用同一个字符串常量
    String a=new String("aaaaa"); //新建一个"aaaaa"字符串
    String b=a;;//->b中的地址=a的地址.b与a引用同一个字符串常量
      

  3.   

    http://community.csdn.net/Expert/topic/2868/2868335.xml?temp=.6094629里面有众多的高手都发表言论
      

  4.   

    楼上请参阅THINKING IN JAVA“传递及返回对象”一章
      

  5.   

    这个问题要jvm的实现角度去考虑问题。虽然String在java中是属于类,并不是属于原始类型。但是由于在系统的处理中,字符串的处理站了90%以上,而字符串使用方便性就比较重要了。因此对于String这种对象,
    jvm会特殊对待。对于String对象的=操作,参数传递操作,进行传值操作。
    因此你才可以进行这样的操作
    String a = "aaa";
    String b = a;
    b += "cccc";而对于其他的任何对象,你都不能使用+操作哦!我曾经看过关于这个问题的英文资料,不过基本忘记了。
    但是大体意思可能就是上面所说的!
      

  6.   

    按小弟的理解,java作为纯oop而言还是有所特别之处,可能是为了符合大多数人的习惯还是保留了诸如int等基本类型,定义变量如int i=5; 很好用。但String不一样,它继承了Object类,String a=new String("aaaaa");才是其标准定义方式,然后却保留了类似定义int型变量的方式String a="aaaaa";这句语句在JVM中应该会被转化为标准方式所以也就没有什么区别了。
      

  7.   

    我想,我搞懂了这个问题!
          我看了一下String类的源码。
      现在举个例子,希望队还没搞懂的朋友有个帮助:
       String aString="aaa";//this.aString对象引用 指向新创建的String对象 .value=
    //"aaa"
      
      fString(aString);
         public String fString(String aString)
    {
        aString="bbb";//aString指向新创建的String对象 .value="bbb"
        }
    //aString对象引用和"bbb"String对象销毁。
    //this.aString还是指向"aaa";
      String bString=aString;//新建bString对象引用指向aString所指向的"aaa"对象。
       bString="bbb";//bString指向新建的对象"bbb";
       bString="aaa";//一般的对象,应该是bString指向新建的对象"aaa"
       //但是,java编译器 对String对象进行了优化,bString会指向已创建的"aaa"
    //以节约内存  而且String对象在创建后就不能改变---看一下String类的源码可知
    //----他没有提供public方法去改变String的实例字段,特别是无法改变this.value
    //这个char[]的值。
        我们假设创建了一个类StringValue,完全复制了String类的代码,并且新增了一个
    public 方法
      public void setValue(String aString);将String的value[]数组的值改变。  StringValue a="aaa";//新建一个StringValue对象引用this.a 指向新建的StringValue对象
    //其中 对象标识符.value="aaa"
    fff(a);
     public void fff(StringValue a)
    {
       a.setValue("bbb");//a指向this.a指向的对象 .value="aaa",所以a.value=="aaa";
    //改变 a.value="bbb";
        a="ccc";//a指向新建的对象"ccc"
    }
       //对象引用a 和对象"ccc"删除
    //this.a指向原来的对象,  但a.value!="aaa",a.value="bbb"   以上程序我的没有测试,请给我测试一下,如有问题,请告诉我。
      

  8.   

    String a="aaaaa";
         String b=a;//这里并没有新建对象。只是b指向了a所指向的对象。
    如果你熟悉的是C++,你要明白,java中所有变量都是类似c++中"引用"这样的东西。
    照你的理解,别的类也是跟String一样的。java中对基本类型按值传递,其他的按引用传递。========================
    String类的参数传递方式的问题和探讨!
          Java是参数传值调用,  这个没有问题。 
       但是,String类的对象  居然是  与  基本数据类型一样。   这个我啊有些搞不懂!
         String a="aaaaa";
         String b=a;//新建了一个对象="aaaaa";     不知道,  String a=new String("aaaaa");
                   String b=a;
             是不是结果与  上面一样啊?   我还没试过!
      
         还有,看了 java类库的  String 源码,  看到实例字段是 char[] 型的字符数组。
           万望高手指教,  告诉我String是怎样实现的,原理何在?
       如果有书解释过这个问题,  请告知我书名·!  
                 不胜感激!
      

  9.   

    同意楼上的。
    另外,在JAVA TUTORIAL里,解释这种String a = "aaaaa";是因为JAVA的编译器遇到不变的字符串时会自动创建一个匿名的STRING对象"aaaaa"。所以可以用类似基本类型的方式创建。另一方面也是因为STRING是一个广泛使用的类型,所以用这种方式。当然,String a = new String();这样的标准的类的创建方式也支持。不过这个创建的是一个空字符串,长度是0。String a = new String("aaaaa");就是楼主写的了。总之,象楼上说的"java中对基本类型按值传递,其他的按引用传递".100%没错.不要被String a = "aaaaa"这个迷惑了就好.
      

  10.   

    我也来讲两句:
    ==================
    String s = "Hello"; // 引用s ------------><[Hello]内存堆栈中> String b = s;       // 引用b ------------>引用s --------->↑String s = New String("Hello"); //引用s ------------><构造[Hello]内存堆栈中> ========1,3不同之处是由于JVM内部操作规范不同至于传参方法,基本数据类型按值传送大家可能都理解,至于Object类型是按引用传递的,而为什么String是按值传递呢?答:错误,一句话,不是按值传递,而是传的是实例Object不可改变的对象引用的Copy,所以还是按引用传递!
      

  11.   

    class test {
    public static void main(String[] args) {
    String a = "100";
    String b=new String("100");
    String c="100";
    System.out.println(a==b);
    System.out.println(a==c);
    System.out.println(c==b);
    }
    }输出结果:false   true     false结论:……