2016-02-11 3 views
-1

Я пытаюсь сохранить объекты, которые имеют имя пользователя и пароль из класса «Драйвер» в список массивов. Когда я пытаюсь напечатать каждое значение в массиве, чтобы проверить, хранятся ли они, он печатает только последнее объявленное количество раз. Я попробовал почти все другие решения на тебя форумах, связанных с этим вопросом, и он просто не будет работать :(Хранение объектов класса в массив

код ниже:

package eDepotSystem; 

import java.util.ArrayList; 


public class Driver { 

    protected static String driverUserName; 
    protected static String driverPassWord; 

    public Driver (String userName, String passWord) { 
     driverUserName = userName; 
     driverPassWord = passWord; 

    } 

    public static void driverArray() { 

     ArrayList<Driver> driverList = new ArrayList<Driver>(); 

     Driver driver = new Driver(driverUserName, driverPassWord); 
     driver.setUserName("driver1"); 
     driver.setPassword("123"); 
     driverList.add(driver); 

     driver = new Driver(driverUserName, driverPassWord); 
     driver.setUserName("driver2"); 
     driver.setPassword("321"); 
     driverList.add(driver); 

     Driver tempDriver = new Driver(driverUserName, driverPassWord); 
     for (int i = 0; i < driverList.size(); i++) { 
      tempDriver = driverList.get(i); 
      System.out.println(tempDriver); 
     } 
    } 

    public void setPassword(String password) { 
     driverPassWord = password; 
    } 

    public static String getUserName() { 
     return driverUserName; 
    } 

    @Override 
    public String toString() { 
     return driverUserName + driverPassWord; 
    } 
} 

Я не знаю, является ли это неправильно мой цикл или путь я m объявить объекты не так? Любая помощь была бы великой и заблаговременно!

+4

'' driverUserName' и driverPassWord' не должны быть статичными – wero

ответ

3

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

0

Ключевое слово static заставляет переменные driverUserName и driverPassWord указываться только раз в памяти. Хотя они не являются константами, он делает любые дополнительные дополнения к вашей ссылке на список, что первый и единственный экземпляр в памяти, следовательно, почему он продолжает показывать одно и то же значение.

https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

3

Задача 1:

Ваши "переменные экземпляра" (имя пользователя и пароль) являются статическими. Поэтому у вас есть только один экземпляр из них. Если вы распечатываете их, вы всегда должны получать одинаковое значение.

Задача 2:

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

Вы должны вместо этого попробовать что-то вроде этого:

package eDepotSystem; 

import java.util.ArrayList; 
import java.util.List; 

public class Driver { 
    private final String driverUserName; 
    private final String driverPassWord; 

    public Driver (String userName, String passWord) { 
     driverUserName = userName; 
     driverPassWord = passWord; 
    } 

    public static void driverArray() { 
     List<Driver> driverList = new ArrayList<Driver>(); 
     driverList.add(new Driver("drv1", "pw1")); 
     driverList.add(new Driver("drv2", "pw2")); 

     for (Driver tempDriver : driverList) { 
      System.out.println(tempDriver); 
     } 
    } 
} 
+0

+1 за цикл. Как указано в «Эффективной Java», второе издание, пункт 46: «Предпочтение для каждого цикла» для традиционного для циклов. «Цикл for-each», представленный в версии 1.5, избавляется от беспорядка и возможности ошибки, скрывая итератор или индекс переменная полностью ' –

+0

Спасибо большое, что помогло кучу, не чувствую себя глупо! – DCWD

+0

Теперь, когда я изменил их из статики, в моей основной строке Driver.driverArray(); больше не будет работать – DCWD