JAVA数组赋值的问题

public class TT
{
public void primitiveTestSet(int size){
size = size * 2;
}

public void objectTestSet(int [] iArraye){
iArraye [0] = 25;
}

public static void main(String []arg){
int size = 5;
TT par = new TT();

par.primitiveTestSet(size);
System.out.println("The size is " + size);

int [] iArray = new int [3];
iArray[0] = size;
par.objectTestSet(iArray);
System.out.println("The 1st iArray element is : " + iArray[0]);
}
}

为什么结果是:
The size is 5
The 1st iArray element is : 25
方法都是void啊!

输出的结果完全正确。

之所以你对输出的结果有疑问,是因为你还没有理解java里面的数据类型。在java里面有两类数据,一种是值类型,还有一种是引用类型。向一个函数传值时,都是把
你的传的那个实参的值拷贝一份给形参。

例如有这么一个函数:

//此函数的功能是求两个整数的和

int sum(int a,int b)
{
int sum;
sum=a+b;
retrun sum;
}

当在主函数里面调用这个函数时:(main函数略)

int x=10,y=20;
int z=sum(x,y);//定义变量z来存放x与y的和。

这个过程是这样的。

把x的值(这里是10),y的值(这里是20),各拷贝一份,分别传个sum函数的形式参数a和b,即此时a和b分别的到了两个值,10、20。然后在函数里面定义了一个变量sum,把a、b的值相加,赋个sum,在返回sum的值。那么在函数里面的求和过程是根本涉及不到x、y的。也就是对x、y没有任何影响。因为是把x、y的值copy一份给a和b。

这是对与值类型的。

那么在java里面还有一种数据类型,叫做引用类型。我不知道你学过c语言没有,如果是学过c语言就很容易理解。这里的引用类型和c语言里面的指针类型差不多。

如有下面的函数:

void tt(int [] aa)
{
aa[0]=10;
}

在main函数这样调用:

int [] bb=new int[]{1,2,3,4,5,6};
tt(bb);
System.out.println(bb[0]);

输出结果是10

因为数组类型是引用类型。当我们调用函数tt时,把bb数组的首地址copy一份传给函数的形式参数aa,由于aa这是候拥有数组bb的地址,所以在aa里面做的修改都回体现在bb上。它修改的是内存中bb所在的那个内存中的值。

//下面是完整的测试:

//test2.java
class test2
{
public static void main(String [] args)
{
int [] aa=new int[]{1,2,3,4,5,6};
test2.tt(aa);
System.out.println(aa[0]);

int a=20,b=30;
System.out.println(test2.sum(a,b));
System.out.println("a:"+a+" b:"+b); //检查a、b的值是否改变。
}

public static void tt(int [] aa)
{
aa[0]=10;
}

public static int sum(int x,int y)
{
int sum=x+y;
return sum;
}
}

//讲了这么多不知道你听懂了没有,还没听明白的话就到百度里搜"值类型,引用类型"吧
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-03-12
结果都是对的阿!
System.out.println("The size is " + size);
这个打印是
public static void main(String []arg){
int size = 5;
这个地方的size = 5;

至于par.primitiveTestSet(size);
这个方法 没有改变size,因为 这个方法中size是一个相当于局部变量了
在这个方法里 size是由变化的,当这个方法返回后传过来的这个size就被系统收回了!但
public static void main(String []arg){
int size = 5;

这个size是不受
par.primitiveTestSet(size);
这个方法改变的!

下面的那个是 数组,他不是基本类型,他给方法传得也不是一个具体的数,而是 引用,就是一个指向iArray这个地方的一个引用!所以以后不关在那里用了这个引用,其实都是改变这个饮用指向的那个地方的数据,

所以
par.objectTestSet(iArray);
这个方法就把
iArray[0]; 的值改变了!

所以JAVA不管什么情况下都是传得值!
这个值,对于基本数据类型 如INT LONG BYTE CHAR等都是 具体的变量数值本身,其他的引用数据类型都是引用!

记住这点你就不会混淆了!
第2个回答  2008-03-12
第一个5没什么说的,第二个25是因为par.objectTestSet(iArray); 时,数组iarray做为一个参数传递进去,然后在函数objectTestSet中,修改了iarray的值! 数组做为参数类似于指针,指向的是数组在内存中的地址,当函数改变传入参数的值的,实际参数的值也发生改变。本回答被提问者采纳
第3个回答  2008-03-13
建议楼主应该了解一下Java的这两个主题:

变量的使用范围
对像的生命周期
第4个回答  2008-03-12
一个只值传递
一个是引用传递
相似回答
大家正在搜