在arrayList多次迭代中存储用户创建的对象

时间:2015-07-19 01:21:23

标签: java object arraylist

我在互联网上搜索了我遇到的问题的答案,似乎无法得到我正在寻找的答案,我有两个类和应用程序类和一个用户类,我提示用户输入要么是新用户,要么返回已设置为容纳用户对象的数组列表中的用户的结果。应用程序结束后,我希望数组列表继续容纳对象,以便在应用程序类中每次连续运行main方法时,我都可以引用arrayList进行交叉检查。

所以我的问题是,当main方法完成并再次运行时,它是从头开始重新创建我的所有对象和arrayList吗?

以下是我正在使用的两个班级。应用程序类首先,用户第二。

import java.util.ArrayList;
import java.util.Scanner;

public class Application{
    static Scanner in = new Scanner(System.in);


    public static void main(String[] args) {


    //Creating admin user object that will be able to access everything
        Users admin = new Users();
        Users result = null;


    //creating a new user that is not an admin
        System.out.println("Are you a new user?");
        String answer = null;
        answer = in.nextLine();

        if(answer.equalsIgnoreCase("YES") || answer.equalsIgnoreCase("Y")) {
            result = admin.addNewUser();
            result.addUsertoArrayList(result);
        }else {
            result.displayUsers(result.users);
        }
    }//End of Main Method.
}//End of Application Class

import java.util.ArrayList;

public class Users extends Application {

    private String username;
    private double biWeeklyIncome = 0;
    private String password;
    private String email;

// ArrayList to store all the objects of Type Users.
    ArrayList<Users> users = new ArrayList<Users>();



// Default Constructor.
    Users() {
    }

// Constructor that takes a string as a name parameter.
    public String name;

    Users(String name) {
        this.name = name;
    }

// Setter Methods.

// User name
    public void setUsername() {
        System.out.println("Enter the username that you wish to go by:\n Ex.      bigBoss45");
       username = in.nextLine();
    }

// Income
    public void setBiWeeklyIncome() {
        System.out.println("Enter your current bi-weekly income: \n Ex.   4500.00");

        try {
            biWeeklyIncome = Double.parseDouble(in.nextLine());
        } catch (NumberFormatException e) {
        // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

// Password
    public void setPassword() {
        System.out.println("Enter the password that you wish to access your account with:\n Ex. bigBoss45");


        password = in.nextLine();
    }

// Email
    public void setEmail() {
        System.out.println("Enter a valid email address: \n Ex. bigBoss45@gmail.com");

        email = in.nextLine();
    }

// Getter Methods

// User name
    public String getUsername() {
        return username;
    }

// Income
    public double getBiWeeklyIncome() {
        return biWeeklyIncome;
    }

// Password
    public String getPassword() {
        return password;
    }

// Email
    public String getEmail() {
        return email;
    }

// Method to create a new user
    public Users addNewUser() {
        String name = null;

        System.out.println("Enter the name of the new user\n Ex.John Smith");
        name = in.nextLine();
    // Creating the new
        Users newUser = new Users(name);

    // Setting the new users information
        newUser.setUsername();
        newUser.setPassword();
        newUser.setBiWeeklyIncome();
        newUser.setEmail();

    //adding the new user to the users arrayList

        displayUsers(users);

        return newUser;
}// end of addNewUser method.

//Method that is going to add a new user to the array List.
    public void addUsertoArrayList(Users nUser) {
        users.add(nUser);
    }

    public void displayUsers(ArrayList<Users> users) {
    // Printing out the user added to the array list for testing purposes.
        for (Users user : users) {
            System.out.println(user.getUsername());
        }
    }//End of displayUser method.


}

我对Java和所有面向对象都很陌生,所以非常感谢任何帮助,感谢您花时间查看我的代码!

2 个答案:

答案 0 :(得分:1)

每次运行java Application之类的命令来运行程序时,您都将启动一个新的java进程。来自任何先前执行的java程序都不会从内存中携带任何数据。

如果要存储数据以使其在过程的多次执行中保持不变,则应考虑将其外部化为文件或数据库等。

答案 1 :(得分:0)

当应用程序关闭时,存储在内存中的对象将丢失。

您可以选择持久化所需的对象。一种方法是在关闭之前将对象序列化为文件,然后在启动时重新加载它们。

在您的情况下,一种简单的方法是使用Java serialization。您需要将可序列化的类标记为实现Serializable,为其提供serialVersionUID字段,并使用ObjectOutputStreamObjectInputStream

顺便说一句,您的Users类代表两种不同的东西 - 一组用户和一个用户。如果每个类代表一个概念,通常事情会更好。考虑将您的Users类拆分为两个类,其中一个包含用户列表,另一个表示单个用户。