很多朋友的回答似乎都有道理,但是我感觉他们在这个问题上似乎自己也不知道有什么道理可讲! 
在JAVA对对象的初始化通常有两种方法: 
  1.基本数据类型:如:int i=5; 
  2.普通类型:入God g=new God(); 
但是String是其中比较特殊的一个问题。可以用以上两种方法来初始化! 
String st=“abc”;和String st=new String(“abc”);而且前者是更通用的一种简单方法。 
至于二者为什么不相等,其实是JAVA中另外一个问题:JAVA中“==”的用法。 
说到这个问题又牵涉到深层COPE的问题。太复杂,这就就用最简单的话,尽力把事情说明,希望楼主能明白就可以了! JAVA中“==”比较的是其两边的对象的物理地址是否相同。 
String st1="abc";String st2="abc";并没有创建一个真正的内存对象,只是将两个String型的引用指向了存放于同一个内存地址的同一个对象“abc”而已。而String st1=new String("abc");String st2=new String("abc");则不同,我们知道,JAVA中new 就是用来开辟一个新的内存空间,然后在这个空间上创建new处理的对象。所以这个引用st1和st2指向的是两个位于不同的内存空间的两个独立的对象。所以他们指向的物理地址是相同的。所以“==”返回true。 另外,额外的提醒一下,我们进行操作的时候通常操作的都是"引用",而不是“对象”。这点经常导致一些难以发现和理解的错误,所以必须要留意! 
谢谢

解决方案 »

  1.   

    是指内存地址吧
    God g=new God();  
    g在栈中实际上他里面就存着一个指向堆空间里新开辟的对象God()的地址,所以g可以叫成一个引用
    恩,我是这么理解的
      

  2.   

    强烈鄙视1分贴引用可以看做是java里的身份证...用来服务于对象且存放于栈中...编写代码的时候为一个对象赋予一个身份证以方便管理和使用...想想看,我们程序员其实从事着同户口管理部门的公务员一样的工作...以上,喵~~~``
      

  3.   

    God g=new God();
    该语句生成了一个新的God对象,而之后我们对于这一对象的操作是通过g来实现的:如g.toString()等对象方法的调用;
    而g究其本质而言是一个“引用”(Reference),所以我们进行操作的时候通常操作的都是"引用",而不是“对象”
    上述语句牵涉到了字符串常量池的概念。
    -----
    另外,对该语句的最后一句感到比较困惑:“所以这个引用st1和st2指向的是两个位于不同的内存空间的两个独立的对象。所以他们指向的物理地址是相同的。所以“==”返回true。” -- 既然  st1和st2指向的是两个位于不同的内存空间的两个独立的对象 ,那么他们指向的物理地址应该是不同的吧
    ???