java 基本数据类型传递参数时是值传递 ;引用类型传递参数时是引用传递 。
我们根据三道问题来探索一下是什么意思。
首先来看一个问题。
问题一
以下方法调用传递给程序是什么 ?
double[] rats = {1.2, 3.4, 5.6};
routine( rats );
A、rats 的副本
B、rats 数组元素的值
C、rats 数组的引用
D、1.2
正确答案是C选项。
在我们之前讲的类与对象中,有讲到引用变量与实例之间的关系。在数组的这道题中,rats就是引用变量,引用了一个数组实例,我们假设这个实例名为x,这个实例有三个连续的数据空间,依次存储了1.2、3.4、5.6三个double类型的数据。
C选项,rats数组的引用就是rats变量引用的实例,函数传进去的就是x这个实例,是正确的。
A选项,rats的副本也就是指复制一个实例x的副本。但实际不是,我们传进去的就是x这个实例,不是它的复制品,A选项是错误的。
B、D选项,并不是传递值,错误。
问题二
以下输出是什么 ?
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 ;}
}
A、1 2 3 4 5
B、什么都不会打印出来
C、程序将因运行时错误而停止。
D、0 0 0 0 0
我们假设myArray引用的数组实例名为x,调用doIt函数时,我们将实例x传递给doIt函数,这时,在doIt函数中,是谁引用数组实例x呢,显然,就是变量z。因此,此时有两个引用变量,一个是myArray,一个是z。而我们在doIt中将z引用的对象换成null,实际上myArray和实例x之间的关系并没有变化。
那么,在main函数中for循环打印myArray变量引用数组中的元素,就依次为1 2 3 4 5。
那么答案就是选项A。
B选项因为myArray变量引用不会改变,因此错误,倘若打印z变量引用数组中的元素就是。
问题三
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] + " ");}}
}
A、1 2 3 4 5
B、99 2 3 4 5
C、 0 2 3 4 5
D、99 99 99 99 99
如问题二所言,我们将myArray引用的数组实例x传递给doIt中,z也引用了实例x,又将实例x赋值给变量A,因此我们改变A引用的实例中第一个元素的值(数组的索引从零开始),myArray引用的实例也会发生改变。
因此应该选B选项。
总结
传给函数的是数组实例,不是数组的引用变量。