2014-01-17 7 views
0

Я пытаюсь заполнить массив объектом типа Person. (Лицо содержит строковое имя и имя и идентификатор целочисленного типа)Массив с простыми объектами

После заполнения массива плохо попробуйте распечатать весь массив. Но он всегда печатает мне фамилию, в которую я ввел «х» раз ... Я пробовал тот же метод с массивом, содержащим целые числа, и он работает. Возможно, некоторые из вас поняли, что там происходит?

Вот код snipplet:

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);  
    } 

... ... ...

И выход выглядит следующим образом:

Введите имя: Имя

Введите имя: второе имя

Введите имя: thirdname

Массива содержит: thirdname thirdname thirdname находки:

Спасибо за вашу помощь!

ответ

1

Это потому, что массив указывает на один объект. Вам нужно сделать new Person() для каждого нового человека.

Как сейчас, TestArray[0], TestArray[1] и TestArray[2], все равны. Поэтому, если вы меняете один из них, он меняет все остальные (поэтому отображается только последнее введенное имя).

+0

Да! * facepalm * Спасибо за быстрый ответ! – user3179570

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 должен быть лучше

+0

спасибо за хороший совет! это указывает на проблему ... спасибо! – user3179570

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; 
} 

Также я настоятельно рекомендую вам использовать именование.

+1

точно (+1) для меня – venergiac

+0

@venergiac, спасибо. –

+0

Спасибо! Этот намек был действительно полезен – user3179570

Смежные вопросы