我有一个调用函数的程序,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引用的对象的引用。因此,如果该对象的属性发生更改,那么更改也将在您的数组中“可见”。

数组不存储对象本身,而是存储对对象的引用。

09-16 06:57