我不确定下面两个代码示例之间的差异是什么。 (第一个示例使用standard library中的Picture.java):
//chooses a photo from your computer and reads RGB values from it
Picture mypic = new Picture(FileChooser.pickAFile());
Pixel pixelArray [] = mypic.getPixels();
pixelArray[0].setRed(255);
Pixel currentPixel = pixelArray[0];
currentPixel.setRed(0);
pixelArray[0].getRed()
输出:0 < ==变量currentPixel中的更改会更改pixelArray [0]中的值而不显式声明。
int array[] = new int[4];
array[0] = 1;
int firstElement = array[0];
firstElement = 9;
array[0]
输出:1 < ==变量firstElement中的更改不会更改数组[0]中的值
<小时/> 为什么第一个代码示例输出0而不是255,为什么第二个代码示例输出1而不是9?
答案 0 :(得分:3)
currentPixel
是对pixelArray[0]
的引用,而不是副本(即它们指向同一个对象)。另一方面,firstElement
是array[0]
的副本。在大多数情况下,将对象分配给变量时,它将是引用而不是副本。如果你想要一个新的Pixel
,你必须通过调用构造函数来创建一个。{/ p>
答案 1 :(得分:3)
第一个是传递对象,Pixel的一个实例。这是通过使用内存中对象的地址来完成的。因此,您对对象所做的任何操作都是对象完成的,而不是对象的副本。这被称为“通过引用”。
在第二个例子中,int firstElement = array [0];获取数组[0]的内存位置的值并将其复制到新的内存位置firstElement。这两个在内存中的位置不同,因此当您更新firstElement时,您不会更新数组[0]。这被称为“按价值”。
编辑:
回答你的问题:没有数组方法。
你得到的是'阵列偏移'。
数组是一个线性的内存块。它被分成相同的大小来处理你要求它的值(32位整数为4个字节,16位整数为2个字节,char为1个字节等)。地址曾经是32位,现在是64位。因此,当引用对象时,array [0]是内存块的基础[1]是base + sizeof(int),依此类推。