class ChangeIt
{
static void doIt( int[] z )
{
int[] A = z;
A[0] = 99;
}
}
class TestIt
{
public static void main( String[] args )
{
int[] myArray = {1, 2, 3, 4, 5};
ChangeIt.doIt(myArray);
for (int i = 0; i < myArray.length; i++)
{
System.out.print(myArray[i] + " ");
}
}
}
这里涉及的是Java中的几个关键知识点:
-
引用类型:在Java中,数组是引用类型。这意味着数组变量(如
z
和A
)并不直接存储数组的数据,而是存储了对数组对象在内存中的引用(地址)。 -
引用赋值:当你执行
int[] A = z;
时,你并不是在复制数组的内容,而是在复制引用。这意味着A
现在指向和z
相同的数组对象。这种赋值是浅拷贝(shallow copy),只复制了引用,没有复制对象本身。 -
对象状态的共享:由于
A
和z
指向同一个数组对象,因此通过A
对数组的任何修改(如A[0] = 99;
)都会影响到通过z
访问到的数组状态。这是因为它们都是访问同一个对象的不同引用。 -
堆内存与栈内存:Java中的对象(包括数组)通常存储在堆内存中,而引用本身(即变量)则存储在栈内存中。栈内存中的引用指向堆内存中的对象。通过引用,我们可以访问和修改堆内存中的对象状态。
-
方法参数传递:在Java中,方法参数是按值传递的,但对于引用类型,传递的是引用的值(即地址),而不是对象本身的拷贝。因此,在方法内部对引用类型的修改(如果修改的是引用指向的对象的状态,而不是引用本身)会影响到方法外部的对象状态。