return为什么为空

dodozhu 2007-06-20 02:00:46

public class StringReverse {


// String resource = null;
//
// String result = null;
//
private static String reverseString(String resource,String result){


for(int i=resource.length()-1;i>0;i--){
result = result + resource.charAt(i);
}

return result;
}

public static void main(String args[]){
String s = "123456789abcdefg";

String result = null;

reverseString(s,result);

System.out.println(result);

}
}

这里result不是已经已经变成result + s了么?
为什么return 以后还是会为空呢?
...全文
860 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
delkar 2007-08-20
  • 打赏
  • 举报
回复
鼓励这样的讨论!
dodozhu 2007-06-22
  • 打赏
  • 举报
回复
我靠,真是受益匪浅啊,谢谢大家
lrb809 2007-06-21
  • 打赏
  • 举报
回复
xuexi
weihthchk 2007-06-20
  • 打赏
  • 举报
回复
楼上几位对参数传递的描述都不准确。
java对于基本类型以外的类型的参数(也就是对象类型的参数),使用引用传递,传过去的是一个引用,和值传递、地址传递(java中不存在)的区别是,值传递会造成形参把实参的值复制一份,而引用传递则是形参把实参的地址复制一份,地址传递是形参直接使用实参的地址。所以,值传递后对形参的修改不会体现在实参中,地址传递对形参的修改同时就是对实参的修改,而引用传递对形参的修改不会体现在实参中——但是形参在函数开始的时候和实参引用了同一个对象,所以对形参引用对象的修改是同时修改了实参引用的对象。
String是不可修改的类,所以指望通过传参数来改变String的内容是不可能的。
tomkai 2007-06-20
  • 打赏
  • 举报
回复
问题很多啊.

1. String 类型的 null 和String相+..结果是 "nullgfedcba987654321"
声明的时候应该赋值为""
2. JAVA中方法的传递是值传递....返回了只是个值....原result地址没变化..所以值也没有变化...
改成 result = reverseString(s, result);
3. for循环少循环了一次..
dryr 2007-06-20
  • 打赏
  • 举报
回复
这个程序的问题大家都已经说得很清楚了,我就不说了,我主要说一下为什么这个result没有被修改掉的原理,我觉得weihthchk(Spectrum)说得还可以,具体如下:
1、java中基本类型以外的类型的变量本身就是引用,即变量的对应的物理地址中存放的是它所指向的object的物理地址,而不是object本身。
2、java对于基本类型以外的类型的参数是使用引用传递的,即形参把实参的物理地址(或是物理地址中的数据)复制一份存放到形参对应的物理地址中,即这里的形参result对应的物理地址中存放的并不是object本身,而只是一个地址。
3、我们必须查看String类的源代码,其中的concat方法是这样实现的:
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
}(其他返回String的方法都是返回一个new String)
4、从第3点的源代码可以看出,返回的是一个新字符串对象,也就是说是新的物理地址,在Test1.java中的代码result = result + resource.charAt(i);就是把result指向新字符串对象对应的物理地址,从第2点的分析中可以知道,result对应的物理地址中存放的是实参的物理地址(或是原object的物理地址),这样经过这句语句执行后,result对应的物理地址中存放的就是新字符串对象对应的物理地址了,所以result再怎么变,都不会反映到原object上了。所以所有的基本类型以外的类型的参数都是使用引用传递的,String也不例外,非String对象也存在这种现象,看如下两个类:
public class Test2 {

private static Test3 reverseString(Test3 resource,Test3 result){
result=result.concat(resource);
return result;
}

public static void main(String args[]){
Test3 t=new Test3("123456789abcdefg");

Test3 t1=new Test3("tttt");

reverseString(t,t1);

System.out.println(t1.ls_str);
}
}
public class Test3{
String ls_str=null;

public Test3(String a){
ls_str= a;
}

public Test3 concat(Test3 t){
return new Test3(ls_str+t.ls_str);
}
}
cccloveyf 2007-06-20
  • 打赏
  • 举报
回复
除了上边探讨的问题,我有个质疑。
for(int i = resource.length()-1; i > 0; i--)
这句,很明显少遍历一个嘛。
应该
for(int i = resource.length()-1; i >= 0; i--)
bend01 2007-06-20
  • 打赏
  • 举报
回复
java是传值的,不是传址的!
碰到"+",调用object的toString
约翰羊 2007-06-20
  • 打赏
  • 举报
回复
呵呵.....
zqrqq 2007-06-20
  • 打赏
  • 举报
回复
楼上的都错了!!!


reverseString(s,result);
改成
result = reverseString(s,result);试试!

java是传值的,不是传址的!
约翰羊 2007-06-20
  • 打赏
  • 举报
回复
null加什么都是null
null + "sdfsFD" =null
shuhang1106 2007-06-20
  • 打赏
  • 举报
回复
你的main方法中的result是一个局部变量,java中局部变量在使用前必须为其负值,而result=null并不是负值,只是创建了一个String类型的引用,该引用并没有指向任何对象(即内存)所以返回为null,如楼上两位所说改为result=""即可
shan1119 2007-06-20
  • 打赏
  • 举报
回复
楼上说的对.
String result = null;
改为String result = "";
安迪 2007-06-20
  • 打赏
  • 举报
回复
我比较赞成zqrqq(zqrain)的解释方法!很直接!
goziung 2007-06-20
  • 打赏
  • 举报
回复
让result=“”;
beiouwolf 2007-06-20
  • 打赏
  • 举报
回复
java传的是引用,并不是值传递的
但是有几个例外,就是所有的基本类型和String类型
基本类型是值传递的,String类型是做潜表复制的
Inhibitory 2007-06-20
  • 打赏
  • 举报
回复
String result = null;
改为String result = "";
因为传入的是null,对null引用的操作是非法的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧