当前位置: 技术问答>java相关
关于数组和字符串传值的问题。
来源: 互联网 发布时间:2017-03-29
本文导语: public class Y { public static void main (String[]args) { int [] a = new int [1]; modify(a); System.out.println(a[0]); String s=new String("Hello"); modify(s); System.out.println(s); int b=0; modify(b); System.out.println(b); } public static ...
public class Y
{
public static void main (String[]args)
{
int [] a = new int [1];
modify(a);
System.out.println(a[0]);
String s=new String("Hello");
modify(s);
System.out.println(s);
int b=0;
modify(b);
System.out.println(b);
}
public static void modify (int[] a)
{
a[0] ++;
}
public static void modify(String s)
{
s+=" world!";
}
public static void modify(int b)
{
b++;
}
}
结果为:
1
Hello
0
请解室一下:)
{
public static void main (String[]args)
{
int [] a = new int [1];
modify(a);
System.out.println(a[0]);
String s=new String("Hello");
modify(s);
System.out.println(s);
int b=0;
modify(b);
System.out.println(b);
}
public static void modify (int[] a)
{
a[0] ++;
}
public static void modify(String s)
{
s+=" world!";
}
public static void modify(int b)
{
b++;
}
}
结果为:
1
Hello
0
请解室一下:)
|
一般会java的,多少懂点c/c++,搂主看看下面这段:
#include "stdio.h"
#include "string.h"
void main ()
{
int[] a = new int[1];
modify(a);
printf("%d", a[0]);
char[] s = "Hello";
modify(s);
printf("%s", s);
int b = 0;
modify(b);
println("%d", b);
}
void modify(int[] a)
{
a[0]++;
}
void modify(char* s)
{
s = new char[strlen(s) + 7 + 1];
sprintf("%s%s", s, " world!");
}
void modify(int b)
{
b++;
}
改变函数参数本身对外部是无效的,只有改变参数所引用的内容对外部才是有效的。
#include "stdio.h"
#include "string.h"
void main ()
{
int[] a = new int[1];
modify(a);
printf("%d", a[0]);
char[] s = "Hello";
modify(s);
printf("%s", s);
int b = 0;
modify(b);
println("%d", b);
}
void modify(int[] a)
{
a[0]++;
}
void modify(char* s)
{
s = new char[strlen(s) + 7 + 1];
sprintf("%s%s", s, " world!");
}
void modify(int b)
{
b++;
}
改变函数参数本身对外部是无效的,只有改变参数所引用的内容对外部才是有效的。
|
由于你在定义数组a时,并没有初始化a[0]的值,所以系统自动初始化为0。int [] a = new int [1];
在你调用modify(a)时,由于参数a的类型是数组,并不是一个基本类型(int,char等属于基本类型),所以modify()函数直接对a[]进行操作,在函数调用后,a[]的数组元素的值也改变了。
第二个也是同样的道理,由于String不是基本类型,所以modify(s)直接对s操作,修改了s的值为“Hello”
而第三个就有所不同了。由于参数b为基本类型int,所以,当你调用modify(b)时,函数是在内存里重新开辟了一个临时存储点,把main()函数里的b的值放入这个临时存储点。然后对这个临时存储点进行++操作,而变量b的原先的存储地址里存放的值并没有变。譬如说,在main()函数里,为变量b分配的地址为1003,然后,1003地址存储的是0。然后,当你调用modify(b)时,系统为modify里的形式参数b分配了临时空间,地址为4500,然后,把1003地址里的值取出来,放到这个临时空间里,这时4500里存的数也是0了!
然后,做b++,注意,这个b不是main()里面的b,而是modify()里面的b,于是,做完b++后,4500里存放的是1,然后modify()结束,释放临时空间。
然而,自始至终,地址1003里面的数字并没有被改变过!!所以main()里面的变量b的值还是0。
JAVA对传递参数的类型的不同,传递方式也是不一样的,只有对基础类型(int short long float char double byte boolean等)是在函数调用期间开辟临时空间,然后传递参数的值,所有操作都在临时空间里进行。而对于传递对象和其他类型(包括数组和String),都是直接在实际参数的地址上直接操作、修改,而不开辟临时空间!
在你调用modify(a)时,由于参数a的类型是数组,并不是一个基本类型(int,char等属于基本类型),所以modify()函数直接对a[]进行操作,在函数调用后,a[]的数组元素的值也改变了。
第二个也是同样的道理,由于String不是基本类型,所以modify(s)直接对s操作,修改了s的值为“Hello”
而第三个就有所不同了。由于参数b为基本类型int,所以,当你调用modify(b)时,函数是在内存里重新开辟了一个临时存储点,把main()函数里的b的值放入这个临时存储点。然后对这个临时存储点进行++操作,而变量b的原先的存储地址里存放的值并没有变。譬如说,在main()函数里,为变量b分配的地址为1003,然后,1003地址存储的是0。然后,当你调用modify(b)时,系统为modify里的形式参数b分配了临时空间,地址为4500,然后,把1003地址里的值取出来,放到这个临时空间里,这时4500里存的数也是0了!
然后,做b++,注意,这个b不是main()里面的b,而是modify()里面的b,于是,做完b++后,4500里存放的是1,然后modify()结束,释放临时空间。
然而,自始至终,地址1003里面的数字并没有被改变过!!所以main()里面的变量b的值还是0。
JAVA对传递参数的类型的不同,传递方式也是不一样的,只有对基础类型(int short long float char double byte boolean等)是在函数调用期间开辟临时空间,然后传递参数的值,所有操作都在临时空间里进行。而对于传递对象和其他类型(包括数组和String),都是直接在实际参数的地址上直接操作、修改,而不开辟临时空间!
|
如果象楼上所说,则输出应该为1,helloworld,0
传数组应该就是c中的传指针,虽然java说没有指针,多看一下c关于形参和实参应该就可以了,我好久没看忘了,不过String作为形参似乎不能直接修改,刚才试试确实不行,不过传递其他对象如Panel等,确实可以直接操作.
传数组应该就是c中的传指针,虽然java说没有指针,多看一下c关于形参和实参应该就可以了,我好久没看忘了,不过String作为形参似乎不能直接修改,刚才试试确实不行,不过传递其他对象如Panel等,确实可以直接操作.
|
楼上考虑得到不全面,而且因果关系确实不对.如果找你所说,在实参的地址上操作,结果应该是hello world
其实这个话题经久不衰,对string修改时,比较绕.
其实不要死抱着安值传还是按引用传,分析一下根源就可以.
main方法种声明了String s,并为其申请了内存空间,那么s这个引用种存放的只是这个内存的地址,可以理解在函数传递中,传递的是s中存放的地址,这个值是作为实参传过去的,所以不会被修改.
好,现在看看方法modify种的操作,s=s+"world",系统申请到了新的内存空间,
此时s的只会改变,但是并不会影响到原来在main方法的s,你打印的时外面的s,
当然结果时s.
其实这个话题经久不衰,对string修改时,比较绕.
其实不要死抱着安值传还是按引用传,分析一下根源就可以.
main方法种声明了String s,并为其申请了内存空间,那么s这个引用种存放的只是这个内存的地址,可以理解在函数传递中,传递的是s中存放的地址,这个值是作为实参传过去的,所以不会被修改.
好,现在看看方法modify种的操作,s=s+"world",系统申请到了新的内存空间,
此时s的只会改变,但是并不会影响到原来在main方法的s,你打印的时外面的s,
当然结果时s.