class TestIt
{
public static void main ( String[] args )
{
int[] myArray = {1, 2, 3, 4, 5};
ChangeIt.doIt( myArray );
for(int j=0; j<myArray.length; j++)
System.out.print( myArray[j] + " " );
}
}
class ChangeIt
{
static void doIt( int[] z )
{
if(z.length>0)z[0]=8;
z = null ;
}
}
这个输出的结果是8 2 3 4 5.
我知道对象或数组作为参数传递时,传递的是一个引用,将z[0]赋值为8直接将z指向的数组{1, 2, 3, 4, 5}第一个元素改为8,但是将z指向null为什么就变成值传递了呢
这里主要是要明白一个点,如果传递一个值,你在函数内是修改不了外部传入的这个值的
那么这个值可以是个整数,也可以是个对象。我们可以修改对象的元素,但不能修改对象本身,这个逻辑和上述整数值传递不能修改传入变量是相同的逻辑啊
因为值传递是一个复制品。那么对象本身传递也是复制品,但传入值和复制品的值是一样的,指向同一个地址,这个地址的内容,函数内外都可以修改且共享
数组是引用类型
如果你只修改z里的值,而不改变z本身,那么你修改的就是z
但是如果你给z重新赋值,那么你修改了它的引用,将它重新指向了一个新的地址,这样就与原地址脱钩了
-=-=-==
举个例子吧
数组就好比超市里的一排货架,数组的名字z好比你的购物清单,购物清单上写的商品名是指向货架的
你根据货物清单找到货架,最终从货架上拿到货物,那么你就直接修改了货物本身
如果你去涂改你自己的货物清单,把香肠改成意大利面,摆放香肠的货架本身是不会跟着变的
打个简单的比方你有一个房子一把钥匙A,你给你的朋友复制了一把钥匙B,通过钥匙B你可以进这个屋子改变屋子里的任何东西,有一天你把这个钥匙B毁了,你就以为房子都没了吗?
改变数组是改变了同一个引用的内容,赋值只是改了当前方法的局部引用,不会影响外部