【问题标题】:Java: My new object instantiation is changing a previous object referenceJava:我的新对象实例化正在更改以前的对象引用
【发布时间】:2013-03-06 16:34:02
【问题描述】:

我正在尝试弄清楚这里发生了什么,并希望得到任何帮助。我有一个循环,我在其中创建新对象,然后将它们添加到 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);
    }
}

所以最后fruitList 包含5 个对象- 都与fruitArray 中的最后一个元素相同(葡萄紫)。

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

我在这里缺少什么?

【问题讨论】:

  • 请出示您的Fruit 代码。我的猜测是你有静态字段应该是实例字段。
  • 谢谢@JonSkeet,你是​​绝对正确的!删除了静态,现在可以正常工作了。

标签: java object reference arraylist


【解决方案1】:

我已经测试了您的代码,它适用于经典的 Fruit 实现:

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

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

所以我想这些字段是static:

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

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

【讨论】:

  • 是的,你完全正确。太感谢了。这就是我凌晨 4 点编码所得到的结果!从水果字段中删除了静态,它工作正常。哇!
【解决方案2】:

如果您在应用中的其他位置不需要中间 fruitArray,您可以按如下方式简化代码:

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]));
}

【讨论】:

    【解决方案3】:

    我创建了以下示例并使用compileonline 对其进行了测试,没有任何问题。问题可能出在您的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);
            }
         }
    } 
    

    结果:

    apple + red
    banana + yellow
    orange + orange
    pear + green
    grape + purple
    apple + red
    banana + yellow
    orange + orange
    pear + green
    grape + purple
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2014-12-06
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多