【问题标题】:Array with simple object failure具有简单对象失败的数组
【发布时间】:2014-01-17 19:20:32
【问题描述】:

我正在尝试用 Person 类型的对象填充数组。 (Person 包含 String lastname 和 firstname 以及 typ integer 的 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);      
    }

... ... ...

输出如下:

输入姓名:名

输入姓名:第二名

输入姓名:第三名

数组包含: 第三名 第三名 第三名 找到:

感谢您的帮助!

【问题讨论】:

    标签: arrays object


    【解决方案1】:

    这是因为所有的数组单元都指向同一个地方。 您需要使用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】:

    也许是健忘

      Person testperson 
    

    始终是同一个实例被引用了 3 次。 每次更改同一个对象时。

    考虑下面的代码

    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应该更好

    【讨论】:

    • 感谢您的好建议!这指出了问题...谢谢!
    【解决方案3】:

    这是因为数组指向单个对象。您需要为每个新人创建一个new Person()

    现在,TestArray[0]TestArray[1]TestArray[2] 都是相等的。因此,如果您更改其中一个,它会更改所有其他名称(因此只显示最后输入的名称)。

    【讨论】:

    • 是的! facepalm感谢您的及时答复!
    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 2014-01-15
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2017-03-07
    • 2022-06-15
    相关资源
    最近更新 更多