对象变量
Date birthday = new Date()
这里birthday
就是对象变量,而不是对象本身,对象本身为 new Date()
,可以将对象变量理解成变量的名字,也可以理解成C++
里面的指针。这个名字一般情况下不是初始化之后就不能变,也可以作为别的对象的名字。
对象数组
好了,现在来说说数组。先看代码Date[] births = new Date[2]
这时,这时你可能会想到,既然说对象变量是指针,那births
不就是元素为指针的数组了吗?很遗憾,结果出乎你意料,births准确来说是一个指针,一个指向数组的指针,而不是指针的集合。
举例子
class tea {
private int id;
public tea(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
public static void main(String[] s) {
tea[] arr=new tea[2];
arr[0]=new tea(1);
arr[1]=new tea(2);
tea[] a=arr;
a[0]=new tea(8);
System.out.println(arr[0].getId());
}
结果
分析:如果arr
是一个元素为指针的数组,a
是arr
的克隆,理论上执行a[0]=new tea(8)
,不应该对arr
的产生影响,而只是改变了a
中指针的指向。但是事实与之不符,所以arr
准确来说是个指针,或者说是一个tea
数组的名字,执行a[0]=new tea(8)
实际上是对数组本身的直接操纵。如果你说它是个tea
数组,也没什么问题,毕竟对象变量名和对象(数组也是对象),从我们的习惯中可以看作等同,都表示着同一个实体。
后语
有了以上结论,那当我们把数组当成函数参数来传参时,要认识到形参是指针的克隆,实参也是指针。在函数体内执行a[0]=new tea(8)
(a
为形参)之类代码时,实则是对实参所指向数组的直接操纵。若只想要传入数组的值,可以先对数组进行克隆,再把克隆后的数组的指针作为实参。