打印 Data 类型的 ArrayList 内容会给出错误的输出 {Java}

Printing ArrayList contents of type Data gives the wrong output {Java}

我有一个数据类型的 ArrayList(它存储一个名为 name 的字符串和一个名为 age 的整数)。打印 Arraylist 的内容时,它会打印正确的年龄,但与我上次添加的元素的名称相同。 这是 PrintCollection 方法

import java.util.*;
import java.util.Iterator;
public class Lab5 {
  public static void PrintCollection(Collection<Data> c)
  {
    for (Iterator<Data> iter = c.iterator(); iter.hasNext();)
    {
        Data x = (Data)iter.next();
        x.Print();
    }
    System.out.println();
  }

}

这里是 class 数据

import java.util.ArrayList;

public class Data 
{
    public static String name;
    private int age;
    Data(String n,int a)
    {
        name = n;
        age = a;
    }
    public String GetName()
    {
        return(name);
    }
    public void SetName(String n)
    {
        name = n;
    }
    public int GetAge()
    {
        return(age);
    }
    public void SetAge(int a)
    {
        age = a;
    }
    public void Print()
    {
        System.out.print(("("+GetName()));
        System.out.print(",");
        System.out.print(GetAge());
        System.out.print(") ");
    }
    public static void main(String args[])
    {
        ArrayList<Data> array = new ArrayList<Data>();
        Data x = new Data("Fred",21);
        array.add(x);
        Data y = new Data("Jo",43);
        array.add(y);
        Data z = new Data("Zoe",37);
        array.add(z);
        Lab5.PrintCollection(array);
    }

}

只需删除此行中的关键字 static

public static String name;

另外最好也做成private,以保持封装。

那是因为name不是实例变量,属于class定义的,每次访问它,都是指 对象引用;而 age 是一个实例变量,这意味着对于 class 的每个实例,都会有一个不同的 copy/reference of/to 不同的对象(您的GetAge() [错误命名.. 使用 camelCaseForMethodNames] 调用)。

查看实例变量是如何传播的here:

When a number of objects are created from the same class blueprint, they each have their own distinct copies of instance variables.