2016-11-11 6 views
-1

В моем основном методе мне нужно распечатать два объекта, созданных во втором классе. Это мой код.Как переопределить метод toString, когда мой объект содержит массив?

public String toString(){ 

     String z = ""; 
     for(int i = 0; i<data.length;i++){ 
      z = z + data[i] + ", "; 
     } 
     return z; 
    } 

У меня есть конструктор Stat, который устанавливает данные массива в массив, вызываемый в вызывающем объекте.

public Stat(double[] d){ 
     double[] data = new double[d.length]; 
     this.data = data; 

Это, как я инициализируюсь данные

int i=1; 
private double[] data = new double[i]; 

Это класс вызывающего

public static void main(String[] args){ 
double[] data = {1.0, 2.0, 3.0}; 
Stat statA = new Stat(data); 

data[0] = 3.0; 
data[1] = 4.0; 
data[3] = 5.0; 

Stat statB = new Stat(data); 
System.out.println("statA data= " + statA.toString()); 
System.out.println("statB data= " + statB.toString()); 

Когда я запускаю отладчик объекты содержат правильные значения данных, но когда я называю ToString, они оба печатают {0.0, 0.0, 0.0}

+0

Почему вы думаете, что проблема с 'toString'? –

+0

FYI: вы можете сократить ваш 'toString()', чтобы возвращать String.join (",", data); 'if' data' является 'List ' (может быть легко внесен в список). – Gavin

ответ

0

Я считаю, что ваш

public Stat(double[] d){ double[] data = new double[d.length]; this.data = data;

вызывает проблему, как вы создаете новый массив размера входного массива (d.length), поэтому массив в классе не содержит данных. Вы хотите что-то вроде:

public Stat(double[] d){ this.data = d }

0

Вы можете попробовать с Arrays.toString(statA), если данные члена экземпляра неуместны.

5

Вот ты проблема:

public Stat(double[] d){ 
     double[] data = new double[d.length]; 
     this.data = data; 

создается массив данных, который является новый массив размера D.Length. В новой выделенной памяти Java по умолчанию заполнено 0, поэтому вы получили это в своей программе.

Изменить этот код, e.x .:

public Stat(double[] d){ 
     this.data = d; 
+1

Это в основном правильно. Однако 'this.data' будет ссылкой на' d', а не на отдельный массив, поэтому, когда содержимое будет изменено после конструктора 'statA', будет изменено значение statA.data'. Этого, очевидно, можно избежать, используя отдельный массив для построения 'statA' и' statB', но было бы лучше использовать 'this.data = Arrays.copyOf (d, d.length);' на всякий случай. – jonhopkins

+0

@jonhopkins - это правда, но, как вы можете видеть в коде, автор три раза хотел изменить значение элемента массива. Копирование массива предотвратит это, что очевидно, из-за различных ссылок. Но это то, что хотел автор? –

+0

Возможно, что изменение данных в обоих объектах - это то, что хочет и ожидает OP. В этом случае код можно оставить как есть (используя ваши изменения, конечно). Но я не могу придумать много случаев, когда это то, что нужно, поэтому я оставил свой первый комментарий в качестве заметки о том, что на самом деле произойдет, и если это не то, чего хочет OP, то, вероятно, он скорее избежит другого вопроса, спрашивая, почему ' statA' и 'statB' печатают то же самое. – jonhopkins

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

  • Нет связанных вопросов^_^