我有一个调用函数的程序,requestAudioBlocks请求一些数据。在其中,它初始化一个数组,然后调用对数据的请求。
private ReadAudioData[] receivedAudioMessages;
private int receivedMessageCount;
private boolean requestAudioBlocks(long blocksPerRequest)
{
receivedAudioMessages = new ReadAudioData[2];
receivedMessageCount = 0;
connection.sendRequest(); //Send the command
}
运行connection.sendRequest时,connection.sendRequest调用saveAudioBlocks,向其发送变量download,该变量将被放入数组中。
private ReadAudioData audioDataPacket;
public void sendRequest()
{
ReadAudioData readAudioData;
while (int count = 0; count < 2; count++)
{
readAudioData = new ReadAudioData();
//Add the received information into the readAudioData variable
audioDataPacket = readAudioData;
saveAudioBlocks(audioDataPacket);
}
}
每次接收到新的ReadAudioData对象时,都会调用saveAudioBlocks。
public void saveAudioBlocks(ReadAudioData download)
{
receivedAudioMessages[receivedMessageCount] = download;
receivedMessageCount++;
}
在程序的运行中,两次调用saveAudioBlocks,这应该将两个ReadAudioData对象放入数组receiveAudioMessages中。
由于正确的ReadAudioData对象进入了receiveAudioMessages [0],因此它第一次起作用。
ReadAudioData对象具有变量String,在这种情况下为“ 111”。如果在receiveMessageCount ++行的saveAudioBlocks中放置一个断点,则可以查看数组,它包含带有String变量“ 111”的ReadAudioData对象,因为它应该位于位置0。
但是,当使用新的ReadAudioData对象再次调用saveAudioBlocks时,如果您在位置0处查看receiveAudioMessages数组,则ReadAudioData对象是包含在传递给函数的变量download中的新的ReadAudioData对象,该变量包含String变量“ 122”。
几乎就像我将指向变量download的指针保存在数组中,而不是保存当前的实际对象一样。
我也尝试使用ArrayLists,但是发生相同的问题。
我在saveAudioBlocks处有一个断点,以确保在我不知道或不知道时,不会调用它来替换数据。
有人可以帮忙吗?
最佳答案
几乎就像我将指向变量download的指针保存在数组中,而不是保存当前的实际对象一样。
这就是发生的情况。您存储对由局部变量download
引用的对象的引用。因此,如果该对象的属性发生更改,那么更改也将在您的数组中“可见”。
数组不存储对象本身,而是存储对对象的引用。