2013-04-24 3 views
0

Это часть домашнего задания.Модификация массива в методах

Для части задания я должен сделать несколько массивов, передать их методам, изменить их там и, в общем, поиграть с ними. Большинство из них я сделал успешно, но у меня проблема с последней частью. Я создаю четыре массива примитивных типов четырьмя недействительными методами. Затем я передаю эти массивы (и массив объектов) в другой метод void, который строит массив объектов, используя значения из массивов. Когда я пытаюсь использовать toString для печати состояния этих объектов, он каждый раз возвращает состояние последнего объекта в массиве (через тесты, Ive обнаружил, что после завершения метода BuildWine значения массива Wine эквивалентны значения последнего созданного объекта.Однако, когда toString напечатано внутри метода, оно правильно печатается.

Я смущен, почему массивы примитивов будут правильно изменены при манипуляции таким образом, но массив объекты изменяются таким странным образом (она должна либо оставаться пустой, выдаст сообщение об ошибке, или что-то, не переопределяет все со значением последнего созданным объекта). Спасибо за помощь.

public class LabSeven { 


    public static void main(String[] args) { 
     int[] wineAges = new int[5]; 
     String[] wineNames = new String[5]; 
     int[] wineQuantity = new int[5]; 
     double[] winePrice = new double[5]; 
     Wine[] wineList = new Wine[5]; 

     BuildAges(wineAges); 
     BuildNames(wineNames); 
     BuildQuantity(wineQuantity); 
     BuildPrice(winePrice); 
     BuildWine(wineList, wineAges, wineNames, wineQuantity, winePrice); 

     for(int i = 0; i < wineList.length; i++){ 
      System.out.println(wineList[1].toString() + "\n"); 
     } 
    } 

    public static void BuildAges(int[] wineAges){ 
     wineAges[0] = 10; 
     wineAges[1] = 23; 
     wineAges[2] = 13; 
     wineAges[3] = 25; 
     wineAges[4] = 50; 
    } 

    public static void BuildNames(String[] wineNames){ 
     wineNames[0] = "Chardonay"; 
     wineNames[1] = "Riesling"; 
     wineNames[2] = "Merlot"; 
     wineNames[3] = "Chianti"; 
     wineNames[4] = "Pinot Noir"; 
    } 

    public static void BuildQuantity(int[] wineQuantity){ 
     wineQuantity[0] = 10; 
     wineQuantity[1] = 14; 
     wineQuantity[2] = 4; 
     wineQuantity[3] = 7; 
     wineQuantity[4] = 1; 
    } 

    public static void BuildPrice(double[] winePrice){ 
     winePrice[0] = 100.50; 
     winePrice[1] = 75.50; 
     winePrice[2] = 45.50; 
     winePrice[3] = 200.50; 
     winePrice[4] = 1250.50; 
    } 

    public static void BuildWine(Wine[] wineList, int[]wineAges, String[] wineNames, int[] wineQuantity, double[] winePrice){ 
     for (int i = 0; i < wineAges.length; i++){ 
      wineList[i] = new Wine(wineAges[i], wineNames[i], wineQuantity[i], winePrice[i]); 
      //System.out.println(wineList[i].toString() +"\n"); 
     } 
    } 
} 




public class Wine { 
    static int age; 
    static String type; 
    static int quantity; 
    static double price; 

    public Wine(int wineAge, String wineType, int wineQuantity, double winePrice){ 
     age = wineAge; 
     type = wineType; 
     quantity = wineQuantity; 
     price = winePrice; 
    } 

    public String toString(){ 
     String status = ("Wine's Age: " + age + "\nWine's Type: " + type + "\nWine's Quantity: " + quantity + "\nWine's Price: " + price); 

     return status; 
    } 

} 
+0

Отметьте, что вы подразумеваете под кодом –

+0

Также обратите внимание, что 'System.out.println (wineList [1] .toString() +" \ n ");' каждый раз обращается к одному элементу массива через цикл. Это должно быть 'System.out.println (wineList [i] .toString() +" \ n ");'. –

ответ

4

В классе Wine вы отметили все атрибуты как static, то есть одно значение для всего класса, независимо от того, сколько экземпляров вы создаете. Ваш конструктор переписывает все значения каждый раз, когда он вызывается.

Удалите static из всех 4 атрибутов в Wine, так что для каждого создаваемого объекта Wine есть по одному значению.

+0

Это исправило это сразу, спасибо. Я не думал об атрибутах объекта Wine и предполагал, что проблема была в классе LabSeven. Я думаю, я сделал их статическими, чтобы очистить предупреждение затмения, не задумываясь об этом. –

+0

Это хорошая идея _думать об этом_, прежде чем создавать поля статические ;-) – jahroy

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