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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 来了都是heima 中级黑马   /  2016-5-29 00:03  /  1539 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.  下面程序的运行结果是什么( A   )
  public static void main(String[] args){
    String s1 = “abc”;
    String s2 = “xyz”;
show(s1,s2);
System.out.println(s1+”-----”+s2);
}
static voidshow(String s1,String s2){
   s1 =s2+s1+”Q”;
    s2 = “W”+s1;   
}
a)   abc-----xyz
b)   xyzabcQ-----xyzWabc
c)   xyzabcQ----xyzabcQWabc
d)   xyzQ----Wabc

17 个回复

倒序浏览
字符串的值只能初始化一次,之后就不能在改变了,是常量,存储在常量池中
回复 使用道具 举报
字符串是常量,初始化之后就不会改变,对象怎么都不会改变的
回复 使用道具 举报
show方法返回了这两个常量的地址值,但是并没有用一个变量来接收,show完后,下一句话开始,show之中的变量就被释放掉了。如果打印的是System.out.println(show(s1,s2));就是得出你想要的答案
回复 使用道具 举报
应该和常量没关系,而是因为show方法中的形参只在方法内起作用,改变变量的值并不会修改主方法中变量的值
回复 使用道具 举报
当你调用show方法的时候show方法进栈内存,然后在堆内存中创建一个S2+S1+"Q"的对象地址值赋给show方法中的S1,S2同理,关键在于show方法结束的时候会弹栈,方法自己从栈内存中消失,存储在方法中的S1,S2地址值自然也 消失了 此时,输出语句调用的自然是本身的S1,S2,如果你想输出改变后的字符串,只需要将输出语句位置放在show方法中就行了
回复 使用道具 举报
字符串是常量 不是变量
回复 使用道具 举报
曾宇 中级黑马 2016-5-29 13:02:36
8#
方法参数中的变量是形参。不要被String s1 误导了。
简单点说,就是作用域不同。
main方法中的s1,和show方法中的s1不是一个参数。
相当于两个方法中的两个名字相同但内存地址不同的两个参数
回复 使用道具 举报
因为S1 S2局部变量,虽然执行了show方法,但是没有改变S1S2值
回复 使用道具 举报
woshijingke 发表于 2016-5-29 00:10
字符串的值只能初始化一次,之后就不能在改变了,是常量,存储在常量池中 ...

明白了,感谢!!
回复 使用道具 举报
RAo_w82Si 发表于 2016-5-29 10:27
当你调用show方法的时候show方法进栈内存,然后在堆内存中创建一个S2+S1+"Q"的对象地址值赋给show方法中的S ...

大神分析得很有道理,满分~~~
回复 使用道具 举报
lizhenzhen 发表于 2016-5-29 13:07
因为S1 S2局部变量,虽然执行了show方法,但是没有改变S1S2值

大神分析得有道理,感谢!!!
回复 使用道具 举报
曾宇 发表于 2016-5-29 13:02
方法参数中的变量是形参。不要被String s1 误导了。
简单点说,就是作用域不同。
main方法中的s1,和show方 ...

分析内存才知道,感谢大神指点!!!
回复 使用道具 举报
王子鹏 发表于 2016-5-29 11:19
字符串是常量 不是变量

是的,赋值一次就不能被改变了
回复 使用道具 举报
字符串是常量
回复 使用道具 举报
还没学习到这里来。
回复 使用道具 举报
ljd 中级黑马 2016-6-1 16:51:50
17#
虽然调用了show() 方法,但是show()的s1和s2只在方法中起作用,二打印输出的s1和s2是你定义的s1、s2的值,并不是方法体中的值
回复 使用道具 举报
shows方法中的s1和s2是局部变量,输出的是成员变量的s1和s2
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马