Java ArrayList不允许我从外部构造函数添加

时间:2009-12-10 22:19:00

标签: java collections arraylist

public class Start {
    public Register theReg = new Register();
    public static Start go = new Start();

    public static void main(String[] args) {
        Register theReg = new Register();
        go.regUsers();

        if(theReg.logIn("jsmith","password")) {
            System.out.println("You're logged in as " +
                               theReg.userLoggedIn.getName());
        } else {
            System.out.println("dang");
        }
    }

    public void regUsers() {
        Student regJoe =
            theReg.regSeniorStaff("Joe smith", "password", "jsmith", 1);
    }
}

public class Register {
    public ArrayList<People> users;
    public People userLoggedIn;

    public Register () {
        users = new ArrayList<People>();
        users.add(new Student("john","password","jo",1));
        userLoggedIn = null;
    }

    public Student regStudent(String name, String password,
            String username, int stuId) {
        Student s = new Student(name, password, username, stuId);
        users.add(s);
        return s;
    }
}

我想我错过了一些愚蠢的事情。像....

start方法将创建一个新的Register对象,其ArrayList。然后,它开始使用像regStudent这样的方法开始注册用户。但是,只有Register上的构造函数允许我向ArrayList添加对象;稍后调用方法做同样的事情就是不添加它们。它创建对象但不能添加它们。也无法删除内容,只有.get可以使用。

任何帮助都会很棒,谢谢!

4 个答案:

答案 0 :(得分:3)

看起来好像隐藏了theReg全局var。您最有可能查询全局,并且看到只有构造函数添加的项目在您的ArrayList中。

public class Start {
    public Register theReg = new Register(); //<<---- your global var
    public static Start go = new Start();

    public static void main(String[] args) {
        Register theReg = new Register();  // <<---- hiding the global
        go.regUsers();

        if(theReg.logIn("jsmith","password")) 
          System.out.println("You're logged in as " + theReg.userLoggedIn.getName());
        else 
          System.out.println("dang");
    }
}

答案 1 :(得分:2)

这是学习如何使用调试器的好时机。 Eclipse有一个很好的调试器;您可以在第users.add(s)行设置断点,并检查列表users的内容。

您可能还想仔细检查在执行期间是否正在调用您的regStudent方法。如果您正在使用Eclipse,则可以右键单击并在工作区中查找对该方法的所有引用,并确保在执行期间调用其中一个。

答案 2 :(得分:1)

你知道如何使用课程吗?这个例子中的命名没有多大意义。为什么“注册”具有“userLoggedIn”“People”对象?如果那是一个“人”对象,那会不会更有意义呢?

Register r = new Register().
r.regStudent( ... );
r.regStudent( ... );

应该可以正常工作。

我的猜测是你有这样的事情:

public static void registerStudent()
{
   Register r = new Register();
   r.add( ... );
}

我是对的吗?

你认为我们可以阅读思想,所以我试了一下。听起来你可能会反复实例化你的寄存器对象,而不是实际持有一个引用并在其上调用方法。这会产生你描述的行为。

修改 看起来你不知道如何使用类。这是一个教程:
http://java.sun.com/docs/books/tutorial/java/javaOO/classes.html

答案 3 :(得分:1)

您的错误是您有两个变量名称theReg - 一个是Start类的实例成员,另一个是main()中的局部变量} 方法。然后,您将一个人添加到其中一个Register个实例中,并询问另一个人是否已添加此人。