我正在尝试使用Person类型的对象填充数组。 (Person包含String lastname和firstname以及典型整数的ID)
填充数组后,我会尝试打印整个数组。但它总是打印我输入“x”次的姓氏...我尝试使用包含整数的数组的相同方法,并且它有效。 也许你们中的一些人有线索在那里出错了吗?
以下是代码片段:
public class Tester {
public static void Test() {
int i=0, counter = 0, idx = 0;
Person[] TestArray = new Person[3];
Person testperson = new Person();
testperson.lastname = "";
testperson.firstname = "";
testperson.id = 0;
TestArray[0] = testperson;
TestArray[1] = testperson;
TestArray[2] = testperson;
for (i = 0 ; i < TestArray.length; i++) {
//TestArray[i] = testperson;
TextIO.put("Enter name: ");
TestArray[i].lastname = TextIO.getln();
}
TextIO.put("Array contains: \n");
for (i = 0 ; i < TestArray.length; i++) {
TextIO.putf("%s ", TestArray[i].lastname);
}
... ... ...
输出如下:
输入姓名:名字
输入姓名:secondname
输入姓名:thirdname
数组包含: thirdname thirdname thirdname 找到:
感谢您的帮助!
答案 0 :(得分:2)
也许是健忘
的
Person testperson
始终是三次引用的同一实例。 每次更改同一个对象时。
考虑以下代码
Person testperson = new Person();
testperson.lastname = "";
testperson.firstname = "";
testperson.id = 0;
TestArray[0] = testperson;
testperson = new Person();
testperson.lastname = "";
testperson.firstname = "";
testperson.id = 1;
TestArray[1] = testperson;
testperson = new Person();
testperson.lastname = "";
testperson.firstname = "";
testperson.id = 2;
TestArray[2] = testperson;
或更好地使用构造函数初始化Person
。
最后让我建议使用 CamelCase表示法:TestArray
是一个变量,但“它似乎是一个类”; testArray
应该更好
答案 1 :(得分:2)
这是因为所有阵列单元都指向同一个位置。
您需要使用new Person()
为每个单元格创建一个新实例。
此外,除非您需要,否则请在构造函数中保留初始化,而不是手动初始化。
删除
Person testperson = new Person();
testperson.lastname = "";
testperson.firstname = "";
testperson.id = 0;
更改数组分配以为每个单元格创建新实例。
TestArray[0] = new Person();
TestArray[1] = new Person();
TestArray[2] = new Person();
将以下内容添加到Person
构造函数类:
public Person()
{
lastname = string.Empty();
firstname = string.Empty();
id = 0;
}
此外,我强烈建议您使用命名约定。
答案 2 :(得分:1)
那是因为数组指向单个对象。你需要为每个新人制作一个new Person()
。
现在,TestArray[0]
,TestArray[1]
和TestArray[2]
都是平等的。因此,如果您更改其中一个,则会更改所有其他内容(因此仅显示最后输入的名称)。