Java:我的新对象实例化正在更改以前的对象引用

Java:我的新对象实例化正在更改以前的对象引用,java,object,reference,arraylist,Java,Object,Reference,Arraylist,我正试图弄清楚这里发生了什么,如果有任何帮助,我将不胜感激。我有一个循环,创建新对象,然后将它们添加到ArrayList。但似乎每次通过循环时,新对象实际上也在更改先前创建的对象。我知道ArrayList实际上只包含对对象的引用,但我认为通过每次调用new,我将创建新实例,以便每个引用都是唯一的 代码如下: void copyFields() { String fruitStr = "apple red,banana yellow,orange orange,pear green,gra

我正试图弄清楚这里发生了什么,如果有任何帮助,我将不胜感激。我有一个循环,创建新对象,然后将它们添加到ArrayList。但似乎每次通过循环时,新对象实际上也在更改先前创建的对象。我知道ArrayList实际上只包含对对象的引用,但我认为通过每次调用new,我将创建新实例,以便每个引用都是唯一的

代码如下:

void copyFields()
{
    String fruitStr = "apple red,banana yellow,orange orange,pear green,grape purple";

    String[][] fruitArray = new String[5][];
    String[] fruitPairs = fruitStr.split(",");
    int r = 0;
    for (String fruitPair : fruitPairs) 
    {
        fruitArray[r++] = fruitPair.split(" ");
    }

    ArrayList<Fruit> fruitList = new ArrayList<Fruit>();
    for (String[] f : fruitArray)
    {
        Fruit fruitObj = new Fruit(f[0],f[1]);
        fruitList.add(fruitObj);
    }
}
void copyFields()
{
String fruitStr=“苹果红、香蕉黄、橙黄、梨绿、葡萄紫”;
字符串[][]水果数组=新字符串[5][];
字符串[]fruitPairs=fruitStr.split(“,”);
int r=0;
for(字符串水果对:水果对)
{
水果数组[r++]=水果对.split(“”);
}
ArrayList水果列表=新的ArrayList();
for(字符串[]f:fruutarray)
{
果果bj=新果(f[0],f[1]);
水果列表。添加(水果对象j);
}
}
因此在最后,水果列表包含5个对象-所有对象都与水果数组中的最后一个元素(葡萄紫)相同

您可以看到,我正在尝试从包含水果/颜色对列表的字符串转换为二维数组,再转换为水果对象的ArrayList。我可以验证每个步骤是否正常工作,直到我在调试器中看到结果列表被填充时,每次通过for循环都会更改结果列表中以前的所有对象


我错过了什么

如果您的应用程序中不需要中间
水果数组
,您可以将代码简化如下:

String pairsStr = "apple red,banana yellow,orange orange,pear green,grape purple";
ArrayList<Fruit> fruits = new ArrayList<Fruit>();

String[] pairs = pairsStr.split(",");
for (String pairStr : pairs) {
    String[] pair = pairStr.split(" ");
    fruits.add(new Fruit(pair[0], pair[1]));
}
String pairstr=“苹果红、香蕉黄、橙橙、梨绿、葡萄紫”;
ArrayList=新的ArrayList();
String[]pairs=pairstr.split(“,”);
for(字符串对:对){
字符串[]对=pairStr.split(“”);
添加(新水果(对[0],对[1]);
}

我已经测试了您的代码,它与经典的
水果
实现一起工作:

public class Fruit {
    private String name;
    private String color;

    public Fruit(String name, String color) {
        this.color = color;
        this.name = name;
    }
}
因此,我假设字段是静态的:

public class Fruit {
    private static String name;
    private static String color;

    public Fruit(String name, String color) {
        Fruit.color = color;
        Fruit.name = name;
    }
}

我创建了下面的示例,并用进行了测试,没有任何问题。问题可能出在您的
Fruid
类中:

import java.util.ArrayList;

public class HelloWorld{
    public static void main(String []args){
        String fruitStr = "apple red,banana yellow,orange orange,pear green,grape purple";

        String[][] fruitArray = new String[5][];
        String[] fruitPairs = fruitStr.split(",");
        int r = 0;
        for (String fruitPair : fruitPairs) 
        {
            fruitArray[r++] = fruitPair.split(" ");
        }
        ArrayList<String> testList = new ArrayList<String>();
        for (String[] f : fruitArray)
        { 
            String testString = f[0] + " + " + f[1];
            System.out.println(testString);
            testList.add(testString);
        }
        for (String s: testList) {
            System.out.println(s);
        }
     }
} 

请显示
水果的代码
。我的猜测是,你有静态字段,应该是实例字段。谢谢@JonSkeet,你完全正确!消除了静电,现在工作正常。是的,你完全正确。非常感谢你。这就是我在凌晨4点编码的结果!去除水果田的静电,效果良好。啊!
apple + red
banana + yellow
orange + orange
pear + green
grape + purple
apple + red
banana + yellow
orange + orange
pear + green
grape + purple