Java字符串
字符串在Java中是非常常见的,但是看似简单常见的字符串,往往在有些地方很容易被它迷惑,下面举一个例子
1 public class Demo4 { 2 public static void main(String[] args){ 3 String str = "hello"; 4 chang(str); 5 System.out.println(str); 6 } 7 8 public static void chang(String s){ 9 System.out.println(s); 10 s = s + "!"; 11 System.out.println(s); 12 } 13 }
可能有的人认为通过执行change(str)后,s的值为"hello!",但实际上并不是。下面是运行结果
hello
hello!
hello
对于这个结果,大家不必吃惊,其实仔细想想的话还是不难理解的。我从两个方面来说明。第一,回到字符串String的定义,一个字符串对象的值是由其value决定的,而在String的定义中value成员是被final修饰了的,也就是说字符串对象一旦创建后,其值就确定了,不能改变了;第二,我们来看这个例子的代码,主函数中str指向了"hello"这个对象(在常量区),然后调用change方法时,change方法压栈,在change方法中,有一个局部变量s来接受调用者的传值(即实参),因此,s的值和str的值一样,同样指向了"hello"字符串对象,但是执行s = s + "!";这句代码后,代码的右边生成一个新的字符串对象"hello!"并把地址返回给s,因此此时s不再指向原先的字符串对象"hello"!然后change函数执行完弹栈,接着主函数执行打印str,但是str的值并没有变,他仍然指向"hello"字符串对象,因此打印的结果是"hello"。
另外这篇文章非常不错常量池指出了常量池中实际上存的是引用而不是对象
注:本文来源于对杨元的博客的整理,文中若有不当之处,还请多多指正!
厚积薄发