关于数组和字符串传值的问题。

javaren 2002-12-18 08:13:55
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
请解室一下:)
...全文
237 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
koala999 2002-12-19
  • 打赏
  • 举报
回复
如果象楼上所说,则输出应该为1,helloworld,0
传数组应该就是c中的传指针,虽然java说没有指针,多看一下c关于形参和实参应该就可以了,我好久没看忘了,不过String作为形参似乎不能直接修改,刚才试试确实不行,不过传递其他对象如Panel等,确实可以直接操作.
liqiang_ok 2002-12-19
  • 打赏
  • 举报
回复
楼上考虑得到不全面,而且因果关系确实不对.如果找你所说,在实参的地址上操作,结果应该是hello world
其实这个话题经久不衰,对string修改时,比较绕.
其实不要死抱着安值传还是按引用传,分析一下根源就可以.
main方法种声明了String s,并为其申请了内存空间,那么s这个引用种存放的只是这个内存的地址,可以理解在函数传递中,传递的是s中存放的地址,这个值是作为实参传过去的,所以不会被修改.
好,现在看看方法modify种的操作,s=s+"world",系统申请到了新的内存空间,
此时s的只会改变,但是并不会影响到原来在main方法的s,你打印的时外面的s,
当然结果时s.
zhirenshao 2002-12-19
  • 打赏
  • 举报
回复
回复:koala999(koala)

在JAVA里面,String是当作对象来看的,跟数组一样,直接在实参的地址上操作!!否则刚才程序的输出怎么会是 1,Hello,0 呢?

你刚才是怎么试的,发代码上来看看好吗
zhirenshao 2002-12-18
  • 打赏
  • 举报
回复
由于你在定义数组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),都是直接在实际参数的地址上直接操作、修改,而不开辟临时空间!

sun1979song 2002-12-18
  • 打赏
  • 举报
回复
一般会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++;
}

改变函数参数本身对外部是无效的,只有改变参数所引用的内容对外部才是有效的。
javaren 2002-12-18
  • 打赏
  • 举报
回复
请各位高手帮忙看看:)
目 录 1 一、 PHP入门 3 1. Hello PHP world 3 2. 变量概念及命名规范 3 3. 变量类型 4 4. 动态变量及变量类型检测 7 5. 传值赋值与引用赋值 9 6. 常量概念及定义方法 10 7. 常量用法详细探讨 12 8. 算术运算符 14 9. 比较运算符及类型转换 15 10. 字符串&赋值运算符及运算返回值 19 11. 逻辑运算符 21 12. 三元及递增递减运算符 26 13. 位运算 28 二、 控制结构 32 1. 三大控制结构之顺序和分支 32 2. 分支之switch 34 3. 三大控制结构之循环 36 4. break&continue 42 5. 进制详解 45 三、 函数 50 1. 函数概念&声明&调用 50 2. 形参与实参概念详解 53 3. 实参传值过程详解 55 4. 函数的作用域 57 5. 函数的执行权与执行权的交回 59 6. 函数的返回值 61 7. 动态函数 62 8. 引用传参 63 9. 超全局变量 64 10. 字符串定义及单双引号区别 66 11. 字符串定界符的用法 68 12. 字符串系统函数讲解 70 13. 字符串面试题讲解 79 四、 数组 81 1. 数组概念 81 2. 数组创建方式详细探讨 83 3. 数组单元的增加修改与删除 85 4. 数组的for循环与foreach循环 87 5. 数组游标操作 88 6. list与each 91 7. 数组下标的效率探讨 94 8. 常用数组函数讲解 95 9. 数组面试题讲解 104 五、 Mysql 105 1. 后续教学日程及mysql安装 105 2. PHP连接mysql 106 3. 资源的概念及发送sql查询 109 4. php修改表数据 112 5. php查询表数据 113 6. 查询与修改综合运用 118 7. mysql调试技巧 120 六、 贴吧项目 123 1. 贴吧项目之建表 123 2. include_require详解 124 3. 魔术引号与递归转义 127 4. 错误报告设置 129 5. 函数封装 131 6. 贴吧主页开发 133 7. 贴吧回复页开发 135 8. 时间戳格式化 136 9. 回复数量之sql优化 137

62,614

社区成员

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

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