我们都知道在普通对象打印他的引用的时候,打印的是这个对象在堆内存中的地址,但是当我 String a = new String("aaaaa");
和 String c = "bbbbbbb"; 为什么他们打印的不是地址,而是aaaaa 和bbbbbb呢?现在有两种答案 
1 在构造string对象的时候,需要在常量池中创建aaaaa对象,然后把aaaaa的值传递给a ,所以打印a的时候就直接打印aaaaa了,2  因为java.lang.String类继承了java.lang.Object,重写了java.lang.Object类中的toString()方法,所以打印的时候直接打印值,小弟是个小白,希望大牛可以给合理的解释,万分感谢,万分感谢,万分感谢!

解决方案 »

  1.   

    String重写了toString方法,其他类如果不重写这个就是打印的Object的toString 是一个hash值,并不是内存地址
      

  2.   

    去看String 类的源码。不懂怎么实现的就去看源码。这就是JAVA比C++好学的地方。
      

  3.   

    你列举的第一种答案明显是错的,new String()出来的对象是在堆内存中的,常量池是在栈内存中的,new String()出来的对象需要经过intern()方法之后,才会进入常量池的。
    第二种答案是正确的,以为String重写了Object的toString方法,所以才会出现这种情况,你可以自己试一下,自己写一个类,直接打印,是地址,然后重写toString(),此时打印的值就是toString()决定的了。
      

  4.   

    打印地址是因为你的对象没有重写Object的toString()
    不打印地址是因为你的对象重写了toSrting()
      

  5.   

    Object类提供的toString()方法是打出:【完整类名@十六进制散列码】
    一般用来打印的输出流都会调用对象的toString()方法
      

  6.   

    查看println的方法会方法同是调用对象的.toString()方法,String的toString是返回字符串,普通对象返回的是Object的toString(),因为子类没有实现toString方法,Object的toString()方法返回的是当前对象的引用
      

  7.   

    嗯,重写tostring