日期:2014-05-20  浏览次数:21101 次

return为什么为空

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   以后还是会为空呢?

------解决方案--------------------
String result = null;
改为String result = " ";
因为传入的是null,对null引用的操作是非法的
------解决方案--------------------
你的main方法中的result是一个局部变量,java中局部变量在使用前必须为其负值,而result=null并不是负值,只是创建了一个String类型的引用,该引用并没有指向任何对象(即内存)所以返回为null,如楼上两位所说改为result= " "即可
------解决方案--------------------
除了上边探讨的问题,我有个质疑。
for(int i = resource.length()-1; i > 0; i--)
这句,很明显少遍历一个嘛。
应该
for(int i = resource.length()-1; i > = 0; i--)
------解决方案--------------------
问题很多啊.

1. String 类型的 null 和String相+..结果是 "nullgfedcba987654321 "
声明的时候应该赋值为 " "
2. JAVA中方法的传递是值传递....返回了只是个值....原result地址没变化..所以值也没有变化...
改成 result = reverseString(s, result);
3. for循环少循环了一次..

------解决方案--------------------
楼上几位对参数传递的描述都不准确。
java对于基本类型以外的类型的参数(也就是对象类型的参数),使用引用传递,传过去的是一个引用,和值传递、地址传递(java中不存在)的区别是,值传递会造成形参把实参的值复制一份,而引用传递则是形参把实参的地址复制一份,地址传递是形参直接使用实参的地址。所以,值传递后对形参的修改不会体现在实参中,地址传递对形参的修改同时就是对实参的修改,而引用传递对形参的修改不会体现在实参中——但是形参在函数开始的时候和实参引用了同一个对象,所以对形参引用对象的修改是同时修改了实参引用的对象。
String是不可修改的类,所以指望通过传参数来改变String的内容是不可能的。
------解决方案--------------------
这个程序的问题大家都已经说得很清楚了,我就不说了,我主要说一下为什么这个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);