具有简单对象故障的数组

时间:2014-01-17 19:20:33

标签: arrays object

我正在尝试使用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 找到:

感谢您的帮助!

3 个答案:

答案 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]都是平等的。因此,如果您更改其中一个,则会更改所有其他内容(因此仅显示最后输入的名称)。