【问题标题】:Storing Objects of Class into an Array将类的对象存储到数组中
【发布时间】:2016-02-11 16:05:53
【问题描述】:

我正在尝试将具有“驱动程序”类中的用户名和密码的对象存储到数组列表中。当我尝试打印数组中的每个值以测试它们是否被存储时,它只会打印多次声明的最后一个值。我已经在与此问题相关的论坛上尝试了几乎所有其他解决方案,但它就是行不通:(

代码如下:

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

我不知道我的循环是错误的还是我声明对象的方式是错误的?任何帮助都会很重要,提前感谢!

【问题讨论】:

  • driverUserNamedriverPassWord 不应是静态的

标签: java arrays class object


【解决方案1】:

您的字段变量不应是静态的。 它由 Driver 类的所有实例(即对象)共享,因此它正在打印您添加的最后一个值。

【讨论】:

    【解决方案2】:

    问题一:

    您的“实例变量”(用户名和密码)是静态的。因此,您只有一个实例。如果将它们打印出来,则必须始终获得相同的值。

    问题 2:

    您只添加一个对象。您添加一次,更改它的值并再次添加。如果你打印出来,你必须得到相同的值......即使你删除了statickeywords。

    你应该尝试这样的事情:

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

    【讨论】:

    • +1 表示 for 循环。如 Effective Java, 2nd Edition, Item 46: Prefer for-each loops to traditional for loops 中所述,The for-each loop, introduced in release 1.5, gets rid of the clutter and the opportunity for error by hiding the iterator or index variable completely
    • 非常感谢帮助了很多人,我不觉得很傻吗!
    • 现在我已经将它们从静态更改为我的主字符串 Driver.driverArray();将不再工作
    • @DCWD 您不能从静态上下文中引用非静态变量。我不在静态方法driverArray() 中使用您的变量。你也不应该使用它们。
    【解决方案3】:

    static 关键字强制 driverUserName 和 driverPassWord 变量在内存中仅被实例化一次。虽然它们不是常量,但它会进一步添加到您的列表引用,即内存中的第一个也是唯一一个实例,因此它一直显示相同的值。

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

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 2014-06-26
      • 1970-01-01
      相关资源
      最近更新 更多