很多朋友的回答似乎都有道理,但是我感觉他们在这个问题上似乎自己也不知道有什么道理可讲!
在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。 另外,额外的提醒一下,我们进行操作的时候通常操作的都是"引用",而不是“对象”。这点经常导致一些难以发现和理解的错误,所以必须要留意!
谢谢
在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。 另外,额外的提醒一下,我们进行操作的时候通常操作的都是"引用",而不是“对象”。这点经常导致一些难以发现和理解的错误,所以必须要留意!
谢谢
God g=new God();
g在栈中实际上他里面就存着一个指向堆空间里新开辟的对象God()的地址,所以g可以叫成一个引用
恩,我是这么理解的
该语句生成了一个新的God对象,而之后我们对于这一对象的操作是通过g来实现的:如g.toString()等对象方法的调用;
而g究其本质而言是一个“引用”(Reference),所以我们进行操作的时候通常操作的都是"引用",而不是“对象”
上述语句牵涉到了字符串常量池的概念。
-----
另外,对该语句的最后一句感到比较困惑:“所以这个引用st1和st2指向的是两个位于不同的内存空间的两个独立的对象。所以他们指向的物理地址是相同的。所以“==”返回true。” -- 既然 st1和st2指向的是两个位于不同的内存空间的两个独立的对象 ,那么他们指向的物理地址应该是不同的吧
???