0

我有一个调用函数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向其发送要放入数组的变量下载。

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对象放入数组receivedAudioMessages中。

它第一次起作用,因为正确的ReadAudioData对象进入receivedAudioMessages[0]

ReadAudioData对象有一个变量 String,在本例中为"111"如果您在saveAudioBlocks中的receivedMessageCount++行放置一个断点,您可以查看数组,它包含带有字符串变量“111”的ReadAudioData对象,因为它应该位于位置0

但是,当使用新的 ReadAudioData 对象再次调用saveAudioBlocks,如果查看位置 0 处的receivedAudioMessages数组,则ReadAudioData对象是传递给函数的变量download中包含的新ReadAudioData对象,其中包含 String 变量“122”。

就好像我在数组中保存了指向变量下载的指针,而不是当前的实际对象。

我也尝试过使用 ArrayLists,但也会出现同样的问题。

我在saveAudioBlocks有一个断点,以确保在我不知道且不知道时不会调用它来替换数据。

任何人都可以帮忙吗?

4

2 回答 2

2

就好像我在数组中保存了指向变量下载的指针,而不是当前的实际对象。

这就是发生的事情。您存储对由局部变量引用的对象的引用download。因此,如果该对象的属性发生更改,那么更改也会在您的数组中变得“可见”。

数组不存储对象本身,它们存储对对象的引用。

于 2012-07-30T09:22:46.643 回答
1

这很可能是因为在你的调用代码中(你调用的地方saveAudioBlocks你重用了相同的ReadAudioData变量而不是创建一个新变量。

换句话说,如果你这样做:

ReadAudioData data = new ReadAudioData();
data.setId("111");
receivedAudioMessages[0] = data;

data.setId("222");
receivedAudioMessages[1] = data;

两者receivedAudioMessages[0]receivedAudioMessages[1]对相同数据的引用,该数据现在的 id 为 222。使用 ArrayList,您将获得相同的行为。

这只是一个猜测,因为您没有提供调用该saveAudioBlocks方法的代码。

于 2012-07-30T09:19:56.303 回答