打印 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.
我有一个数据类型的 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.