当前位置:  技术问答>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
请解室一下:)

|
一般会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++;
}

改变函数参数本身对外部是无效的,只有改变参数所引用的内容对外部才是有效的。

|
由于你在定义数组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),都是直接在实际参数的地址上直接操作、修改,而不开辟临时空间!


|
如果象楼上所说,则输出应该为1,helloworld,0
传数组应该就是c中的传指针,虽然java说没有指针,多看一下c关于形参和实参应该就可以了,我好久没看忘了,不过String作为形参似乎不能直接修改,刚才试试确实不行,不过传递其他对象如Panel等,确实可以直接操作.

|
楼上考虑得到不全面,而且因果关系确实不对.如果找你所说,在实参的地址上操作,结果应该是hello world
其实这个话题经久不衰,对string修改时,比较绕.
其实不要死抱着安值传还是按引用传,分析一下根源就可以.
main方法种声明了String s,并为其申请了内存空间,那么s这个引用种存放的只是这个内存的地址,可以理解在函数传递中,传递的是s中存放的地址,这个值是作为实参传过去的,所以不会被修改.
好,现在看看方法modify种的操作,s=s+"world",系统申请到了新的内存空间,
此时s的只会改变,但是并不会影响到原来在main方法的s,你打印的时外面的s,
当然结果时s.

    
 
 

您可能感兴趣的文章:

  • C++ Strings(字符串) 成员 data():返回内容的字符数组形式
  • 请问怎么对一个数组排序,数组的内容是字符串,可能是单个也可能是多个?
  • php二维数组转成字符串示例 iis7站长之家
  • 有个小问题,如何将一字符串按一定规则分割成字符串数组?
  • C++ Strings(字符串) 成员 c_str():将字符串以C字符数组的形式返回
  • 怎么判断一个字符串数组里是不是包含另一个字符串?
  • php二维数组转换为字符串示例
  • 字符串分割成数组
  • 往Vector里循环封装字符串数组的问题
  • php二维数组转成字符串示例
  • 从bean中调用“中文字符串数组”却出现问题。
  • 如何定义一个字符串数组
  • 如何实现将表单内容存进一个字符串数组变量?
  • php像数组一样存取和修改字符串字符
  • 如何分割字符串赋给一个数组变量并打印?
  • bash中可以用字符串做数组下标吗
  • php通过数组实现多条件查询实现方法(字符串分割)
  • 字符串数组问题
  • 汉字组成的字符串转成char[]数组,再组合起来就出现乱码
  • 我想在数组中存放带有空格的字符串,为什么都被自动截断了?? 如何能够解决?
  • c语言中用字符串数组显示菜单的解决方法
  • linux下读取文本文件里汉字存到字符数组里
  • PHP 数组字符集编码转换的函数
  • 如何将Srting类型的字符窜转换成byte[]类型的数组呢?
  • 不管你高低,只要能帮助我就谢谢 。如何对字符数组进行序列化
  • 如何从文件的指定位置把文件内容读入字符型数组?
  • 怎样从键盘上输入一个长度为20的字符窜(数组)?
  • 急! 如何将一个字符串,用指定的分隔符,转换成字符串数组,马上给分!!!
  • 关于函数回传字符数组指针问题
  • *****送分了!哪位知道怎么将字符数组char[]里的每个值都赋为空*****
  • 各位大侠,请问如果一个char数组很大,比如10000000个字符,能不能只用一个String装下它?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c++类对象数组初始化方式
  • C++指针数组、数组指针、数组名及二维数组技巧汇总
  • c#基础之数组与接口使用示例(遍历数组 二维数组)
  • 如何将一个数组重新组成一个新的数组?
  • php定义数组和使用示例(php数组的定义方法)
  • php数组函数之array_combine() 数组合并函数
  • 判断php数组维度(php数组长度)的方法
  • php数组函数之array_count_values() 统计数组中所有值出现的次数
  • 在我的java程序中,我从数据库中得到一批数据,不能确定是多少个,我要把它保存到我的java数组中,可是怎样才能向C++中的数组一样可以自由分配空间,在java中我必需预先指定大小,不会一定要用java中的那个可改变数组大小的类吧?
  • 一个String类型的Vector向量数组如何转换成一个String类型数组(请给代码)?
  • php数组函数之array_unique() 去除数组中重复的元素值
  • 将数组中指定数量的元素移动数组后面的实现代码
  • C++中关于[]静态数组和new分配的动态数组的区别分析
  • php判断一个数组是否为另一个数组子集的方法
  • 将二维数组转为一维数组的2种方法
  • 文件描述符集fd_set * readfds;书上这样描述数组元素的每一位对应一个文件描述符,第一个元素代表文件描述符0到31,数组第二个元素代表文
  • 深入理解数组指针与指针数组的区别
  • php数组函数之array_key_exists() 查找数组键名是否存在
  • c++将数组名作为函数参数对数组元素进行相应的运算
  • php数组函数in_array() 查找数组值是否存在
  • 3个PHP多维数组转为一维数组的方法实例


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3