String s1 = "a";
String s2 = s1 + "b";
天雷滚滚。。
对于编译器而言,执行到String s2 = s1 + "b"; 这段话时,只是在判断语法:左边是Strng类型引用,右边是String类型引用对象+String实例对象。OK语法通过,编译通过。跟上面那句话没有任何关系,基础加强有篇已经说的很清楚:请不要用运行时的思想去套在编译时的处理上。
System.out.println(s2 == "ab"); 这段话只所以是false,是因为s2这个引用所指向的对象直到运行时才直到,也就是说一个引用+一个常量池中的对象的操作是在运行时,在堆中创建一个"ab"对象,然后赋给s2。 而"ab"这个对象在编译时就会在常量池中创建,当然是false
System.out.println(s3 == "ab"); s3也是引用,与s2的区别是:String s3 = "a" + "b"; 这段话在编译时就创建了3个对象,s3指向的池后果的"ab"对象,
而s3=="ab" 右边的"ab"就是池的那个"ab"。
楼上的兄弟是怎么测试到池中有多少对象,求教!
|