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,对null引用的操作是非法的
String result = null;
改为String result = "";
null + "sdfsFD" =null
reverseString(s,result);
改成
result = reverseString(s,result);试试!java是传值的,不是传址的!
碰到"+",调用object的toString
for(int i = resource.length()-1; i > 0; i--)
这句,很明显少遍历一个嘛。
应该
for(int i = resource.length()-1; i >= 0; i--)
声明的时候应该赋值为""
2. JAVA中方法的传递是值传递....返回了只是个值....原result地址没变化..所以值也没有变化...
改成 result = reverseString(s, result);
3. for循环少循环了一次..
java对于基本类型以外的类型的参数(也就是对象类型的参数),使用引用传递,传过去的是一个引用,和值传递、地址传递(java中不存在)的区别是,值传递会造成形参把实参的值复制一份,而引用传递则是形参把实参的地址复制一份,地址传递是形参直接使用实参的地址。所以,值传递后对形参的修改不会体现在实参中,地址传递对形参的修改同时就是对实参的修改,而引用传递对形参的修改不会体现在实参中——但是形参在函数开始的时候和实参引用了同一个对象,所以对形参引用对象的修改是同时修改了实参引用的对象。
String是不可修改的类,所以指望通过传参数来改变String的内容是不可能的。
但是有几个例外,就是所有的基本类型和String类型
基本类型是值传递的,String类型是做潜表复制的
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);
}
}