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 )
{
z = null ;
}
}
输出的值是 1 2 3 4 5
为什么不报空指针错误?我的理解是地址指向null以后myArray就是null了,难道是z和myArray其实是【值传递?】,z和myArray指向同一个地址,然后只是z的地址值被赋值为null了,通过相同的地址改变地址中存放的内容才能真正改变myArray的值?不知道是否是这样理解的,请各位大神指点迷津。
以下代码为对比:
class Test
{
static void doIt( int[] z )
{
for(int i=0;i<z.length;i++)
z[i]=i+2;//单个赋值
}
public static void main ( String[] args )
{
int[] myArray = {1, 2, 3, 4, 5};
Test.doIt( myArray );
for(int j=0; j<myArray.length; j++)
System.out.print( myArray[j] + " " );
}
}
输出的值是2 3 4 5 6
class Test
{
static void doIt( int[] z )
{
for(int num:z)
System.out.print(num+" ");
int[] temp={2,3,4,5};
z=temp;//整体赋值
System.out.println();
for(int num:z)
System.out.print(num+" ");
}
public static void main ( String[] args )
{
int[] myArray = {1, 2, 3, 4, 5};
Test.doIt( myArray );
System.out.println();
for(int j=0; j<myArray.length; j++)
System.out.print( myArray[j] + " " );
}
}
输出的值:
1 2 3 4 5
2 3 4 5
1 2 3 4 5
你的数组传给了方法,你的z=null只是把z这个地址对应的值设为了null,也就是让z指向了null,而没有改变array内部的值,myArray指向的依然是你的数组,而这个数组的值并没有发生任何变化
Java没有引用传递的,你传递给doIt方法的,只是复制的一份引用地址值,比如 a -> address, 现在变成了 a-> address, b -> address, 然后你方法里面吧 b -> address 变成了 b -> null, 但是a -> address没有发生变化的。
面向对象语言中,方法调用时有值传递和引用传递,之所以方法中修改引用对象的属性会对原来调用者有影响是因为调用者和方法中引用了相同地址,所以会受到影响。
但是楼主这里在方法中将引用参数设置为空,但是原来调用者的引用并没有变,当然不会出现空指针了。
除非你在main 中手动再将其设置为 null 。