A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

才考的JAVA基础班API题:
public static void main(String[] args){
                String s1 = “abc”;
                String s2 = “xyz”;
show(s1,s2);
System.out.println(s1+”-----”+s2);
}
static void show(String s1,String s2){
         s1 = s2+s1+”Q”;
    s2 = “W”+s1;   
}

我知道最终输出结果是abc-----xyz

求解一下为什么String类在被方法调用后值并没有改变的详细原理(也就是在内存中的值的变化),谢谢!

5 个回复

倒序浏览
因为show中的s1,s2与main中的s1,s2不同,它们都String类型的引用,但作用域不同。参看以下程序:
  1. public class Test {
  2.     public static void main(String[] args){
  3.          String s1 = "abc";
  4.          String s2 = "xyz";
  5.          show(s1,s2);
  6.          System.out.println("In main: " s1 + "-----" + s2);
  7.     }
  8.     static void show(String s1,String s2){
  9.              System.out.println("In show(在赋值之前): s1 = " + s1);
  10.              System.out.println("In show(在赋值之前): s2 = " + s2);
  11.              s1 = s2+s1+"Q";
  12.             System.out.println("In show(在s1赋值后): s1 = " + s1);
  13.             s2 = "W"+s1;   
  14.             System.out.println("In show(在s1,s2赋值后): s1 = " + s1);
  15.     }
  16. }
复制代码


回复 使用道具 举报
本帖最后由 a397131103 于 2015-5-16 23:42 编辑

首先,main方法先进栈,在堆内存建立俩个string类型对象s1, s2,假设s1地址值是0x001保存abc,s2地址值是0x002保存xyz,
然后show方法进栈,s1,s2 指向对像内存的地址值 , s1=abc ,s2=xyz,  
s1 = s2+s1+”Q”; // s1=xyz+abc+Q 字符串相加获得一个新的字符串. 由于string的不变性 ,s1不会改变,只能在堆中重新创建新对象地址值假设为0x003保存xyzabcQ赋给s1,s1指向0x003
s2 = “W”+s1;  // 同上 s2 指向新的地址值0x004
show方法执行完毕,出栈死亡后,s1 s2 无法指向 0x003  0x004的地址 还是原来的0x001 0x002 地址
所以 值不变还是  abc-----xyz
回复 使用道具 举报
a397131103 发表于 2015-5-16 23:14
首先,main方法先进栈,在堆内存建立俩个string类型对象s1, s2,假设s1地址值是0x001保存abc,s2地址值是0x002 ...

show方法执行时,s1 s2在指向新的地址值时,会和原有的最初地址指向断开,原有的地址指向不是就变垃圾了么?但是show方法结束时,s1 s2的地址值是怎么还原到最初的指向的?
回复 使用道具 举报
。。你调用show方法又没返回值。。
主函数和show方法里面的string变量都是局部变量吧。。
你show方法调用完空间都释放掉了。怎么会影响到主函数的s1,s2值。。
我是这样理解有问题否?
回复 使用道具 举报
main方法只要运行 对象的地址值就给了s1 s2 main里面的s1 s2 的地址值就是0x001 0x002
show中虽然重新给了新的地址值 但是它出栈后 s1 s2 的新地址跟随show一起成为垃圾了
但main还要运行 s1  s2的地址还被main指向着
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马