Java 填充自定义对象的数组会将其他对象的字段修改到数组中

Java 填充自定义对象的数组会将其他对象的字段修改到数组中,java,arrays,populate,Java,Arrays,Populate,我创建了一个名为MipMapData的类来保存关于mipmaps的信息,它保存维度、数据大小和图像格式。 根据代码的另一部分,我创建了一个MipMapData对象数组,问题是每次我向数组中添加一个新的MipMapData对象时,数组中的所有mimpap info对象都会修改其维度字段,当我填充所有数组时,结果是所有对象在其维度字段中的值与添加到数组中的最后一个值相同。 我在维度字段上做错了什么 import java.awt.Dimension; import com.jme3.text

我创建了一个名为MipMapData的类来保存关于mipmaps的信息,它保存维度、数据大小和图像格式。 根据代码的另一部分,我创建了一个MipMapData对象数组,问题是每次我向数组中添加一个新的MipMapData对象时,数组中的所有mimpap info对象都会修改其维度字段,当我填充所有数组时,结果是所有对象在其维度字段中的值与添加到数组中的最后一个值相同。 我在维度字段上做错了什么

    import java.awt.Dimension;
import com.jme3.texture.Image;
import com.jme3.texture.Image.Format;


public class MipMapData {
    private Dimension dimension;
    private Long dataSize;
    private Image.Format format;

//Constructor calculates size. Has this arguments to avoid the existence of mipmap incomplete data or with errors in datasize
public MipMapData(Image.Format format, Dimension dimension){
    this.format=format;
    setDimension(dimension);
}



public Dimension getDimension() {
    return dimension;
}
public void setDimension(Dimension dimension) {
    this.dimension = dimension;


    if(format==Format.DXT5||format==Format.DXT3){
        this.dataSize=(long) (dimension.height*dimension.width);
        if(this.dataSize<16)
            this.dataSize=(long) 16;
        return;
    }
    else if(format==Format.DXT1){
        this.dataSize=(long)((dimension.height*dimension.width)/2);
        if(this.dataSize<8)
            this.dataSize=(long) 8;
        return;
    }
    else if(format==Format.ABGR8){
        this.dataSize=(long)(dimension.height*dimension.width*4);
        return;
    }
    else if(format==Format.Luminance8||format==Format.Depth){
        this.dataSize=(long)(dimension.height*dimension.width);
        return;
    }
}




public Long getDataSize() {
    return dataSize;
}


//The datasize of each mipmap is automatically calculated in the constructor
static MipMapData[] createMipMapDataArray(Dimension textureDimensions, int numberOfMipMaps, Image.Format imageFormat){
    int width=textureDimensions.width;
    int height=textureDimensions.height;
    Dimension mipMapDimension= new Dimension();
    MipMapData[] mipMapDataArray= new MipMapData[11];

    if(imageFormat==Format.DXT5|| imageFormat==Format.DXT3){
        for(int i=0;i<=10;i++){
            if((width)<1)
                width=1;
            if((height)<1)
                height=1;
            mipMapDimension.height=height;
            mipMapDimension.width=width;
            mipMapDataArray[i]= new MipMapData(imageFormat,mipMapDimension);
            //actualize dimensions for next mipmap
            width/=2;
            height/=2;
        }
    }
    else if(imageFormat==Format.DXT1){
        for(int i=0;i<=10;i++){
            if((width)<1)
                width=1;
            if((height)<1)
                height=1;
            mipMapDimension.height=height;
            mipMapDimension.width=width;
            mipMapDataArray[i]= new MipMapData(imageFormat,mipMapDimension);
            //actualize dimensions for next mipmap
            width/=2;
            height/=2;

        }
    }
    else if(imageFormat==Format.ABGR8||imageFormat==Format.Luminance8||imageFormat==Format.Depth){
        for(int i=0; i<=10;i++){
            if((width)<1)
                width=1;
            if((height)<1)
                height=1;
            mipMapDimension.height=height;
            mipMapDimension.width=width;
            mipMapDataArray[i]= new MipMapData(imageFormat,mipMapDimension);
            //actualize dimensions for next mipmap
            width/=2;
            height/=2;

        }
    }
    return mipMapDataArray;
}
导入java.awt.Dimension;
导入com.jme3.texture.Image;
导入com.jme3.texture.Image.Format;
公共类MipMapData{
私人维度;
私有长数据集;
私有图像格式;
//构造函数计算大小。使用此参数可避免存在mipmap不完整数据或数据大小错误
公共MipMapData(Image.Format格式,维度){
this.format=format;
设置维度(维度);
}
公共维度getDimension(){
返回维度;
}
公共void集合维度(维度){
这个维度=维度;
if(format==format.DXT5 | | format==format.DXT3){
this.dataSize=(长)(dimension.height*dimension.width);

如果(this.dataSize调用
createMinMapDataArray()
时,所有字段设置为相同的原因是您检查了某些条件,如

if(imageFormat==Format.DXT5 | imageFormat==Format.DXT3)

然后遍历数组,并使用新的
MinMap()
对象初始化索引,该对象对于每个索引都是相同的

“添加到数组”的概念并不是考虑数组的正确方法。数组通常用于存储预定大小的信息。要将对象添加到第i个索引,您需要执行以下操作:

MipMapData[] minMaps = createMipMapDataArray(// pass your parameters here)
minMaps[10] = new MinMap(// pass your parameters)
当然,这不会将值添加到数组中。它会用新值覆盖/替换minMaps[10]的值

< >将未确定数量的<代码> MIMAPs<代码>添加到列表中,考虑使用<代码> ARARYLISTAB/COD> < /P>
ArrayList minMapList=new ArrayList();
add(newminmap(//在此处传递参数));

您正在循环外部创建一个维度对象,并将其分配给所有MipMapData对象

Dimension mipMapDimension= new Dimension();
请记住,Java中的对象是通过引用传递的。因此,当您将mipMapDimension传递给MipMapData构造函数时,它将在所有对象中被引用

Dimension mipMapDimension= new Dimension();