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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wjj410830911 中级黑马   /  2013-11-15 03:08  /  1689 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Test
  2. {
  3.         public static void main(String[] args){
  4.         StringBuffer sb = new StringBuffer();
  5.         sb.append("qq").append("ww");//这个在后面添加了字符串“qq”又在后面添加了“ww”
  6.         show(sb,"ss"); //调用了show方法
  7.         System.out.println(sb.length());最后输出的长度是6个
  8.                 }
  9.          static void show(StringBuffer sb,String str){
  10.                   sb.append(str); //在show方法里 又添加了“ss”
  11.                 }       
  12. }
复制代码
  1. public static void main(String[] args){
  2.                 String s1 = "abc";
  3.                 String s2 = "xyz";
  4.                 show(s1,s2);
  5.                 System.out.println(s1+"-----"+s2);//这个最后应该输出xyzabcQ------WxyzabcQ
  6.         }
  7.         static void show(String s1,String s2){
  8.                 s1 = s2+s1+"Q";  //我认为   S1=xyzabcQ  
  9.                 s2 = "W"+s1;//我认为s2=WxyzabcQ
  10. }
复制代码
但这个最后的输出缺是abc-----xyz
第二个代码跟第一个一样啊  都是调用了方法 但为什么一个输出时值改变了 一个却没有啊?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

8 个回复

倒序浏览
第二个方法传过去的参数是基础类型,比如String、int、double、byte等,这些参数在方法名称的括号内作为参数传进来,这时候,方法内得到的这个数据就是原始数据的副本,修改与不修改不会影响原始数据。
但是传入的是引用类型比如你的第一个代码、数组、类等,都是传进来的数据的地址,你若在方法内修改的话,原始数据也就发生了相应的变化。
所以在方法内的内部类引用方法名称括号内传进来的引用类型的数据时候,编译器要你在方法参数前加final,以确保内部类不能修改外部类数据,否则编译出错。具体可以搜一下有关知识。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
我觉得楼上的解释有点问题,首先String是一个类它不是基本类型。我觉得出现这样的原因是这样的。
在java中函数的参数传递都是值传递的,在第二段代码中调用show方法时,main方法把s1和s2的值(即2个字符串的地址)传递给了show方法,此时在show方法的栈内存当中就有2个局部变量s1和s2来接受main方法传递的值即在show方法中有main方法中s1和s2的值的一个拷贝。我们知道字符串是不可变对象,所以在你的show方法中改变字符串的内容时内存中会生成一个新的字符串对象并且将地址给局部变量中的s1或s2,此时main中的s1和s2和show中的s1和s2的值就不一样了(这就是导致没变的原因),然后show方法结束,对应的栈内存销毁此时show中的s1和s2就不复存在了。

评分

参与人数 1黑马币 +3 收起 理由
FFF + 3 有点复杂,新人应该看不懂。只能以金币鼓励.

查看全部评分

回复 使用道具 举报
FFF 金牌黑马 2013-11-15 09:18:45
板凳
本帖最后由 FFF 于 2013-11-15 09:20 编辑

wjj410830911回答得很好!~linjl_ll也不错~
再给你一个例子。如果要String修改。可以这样做、
  1.         public static void main(String[] args){
  2.         String s1 = "abc";
  3.         String s2 = "xyz";
  4.         s1=show(s1);//重新对s1声明指向
  5.         s2=show1(s2);//重新对s2声明指向
  6.         System.out.println(s1+"-----"+s2);//这个最后应该输出abcQ------Wxyz
  7. }
  8. static String show(String s1){
  9.         s1 = s1+"Q";   
  10.         return s1;//返回一个值给调用者
  11. }
  12. static String show1(String s2){//这里的返回值类型不能是Void必须为对应的返回值类型String
  13.      s2 = "W"+s2;
  14.     return s2;//返回值给调用者
  15. }
复制代码
回复 使用道具 举报
FFF 发表于 2013-11-15 09:18
wjj410830911回答得很好!~linjl_ll也不错~
再给你一个例子。如果要String修改。可以这样做、 ...

看了你好多个回答,  看来以后会带得带代码例子~ 的确不错!
回复 使用道具 举报
FFF 金牌黑马 2013-11-15 09:43:39
地板
一步一脚印 发表于 2013-11-15 09:41
看了你好多个回答,  看来以后会带得带代码例子~ 的确不错!

有觉悟。偷偷告诉你~一般带例子比不带例子获得技术的几率会大很多!一般人我不告诉他!
回复 使用道具 举报
FFF 发表于 2013-11-15 09:43
有觉悟。偷偷告诉你~一般带例子比不带例子获得技术的几率会大很多!一般人我不告诉他! ...

有的时候闲懒,还要去写一个例子。  不过对于别人理解肯定会更有帮助。  以后我要是会的话也尽量这么回答哈哈。
回复 使用道具 举报
1楼的解释很高端。我对楼主问题的理解是:
像基础类型 如 int byte double string这些的变量,一旦被赋值,就在内存中写死了。如果在函数中传入这些变量作为参数,那么函数中是没法传进来它们的引用的(和引用类型不同),也就是说,运行到调用函数时候,内存会重新把这个变量在函数内存区中复制一份,在里面做函数运算。如果最后你不return出来,那么函数调用结束,这个函数内存区中的所有变量就都消失了,回到主函数,相当于什么也没做~

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
没写返回值呀。。你的方法操作的都是局部变量。。第二个这样修改即可

static String show(String s1,String s2)
{
                s1 = s2+s1+"Q";  //我认为   S1=xyzabcQ  
                s2 = "W"+s1;//我认为s2=WxyzabcQ
                return  s1+"-----"+s2;

}
然后你想让他打印出来就这样在外面写:
System.out.println(show(s1,s2);

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 注意抢答时间,越早答题,才有分.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马