我在互联网上搜索了我遇到的问题的答案,似乎无法得到我正在寻找的答案,我有两个类和应用程序类和一个用户类,我提示用户输入要么是新用户,要么返回已设置为容纳用户对象的数组列表中的用户的结果。应用程序结束后,我希望数组列表继续容纳对象,以便在应用程序类中每次连续运行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和所有面向对象都很陌生,所以非常感谢任何帮助,感谢您花时间查看我的代码!
答案 0 :(得分:1)
每次运行java Application
之类的命令来运行程序时,您都将启动一个新的java
进程。来自任何先前执行的java程序都不会从内存中携带任何数据。
如果要存储数据以使其在过程的多次执行中保持不变,则应考虑将其外部化为文件或数据库等。
答案 1 :(得分:0)
当应用程序关闭时,存储在内存中的对象将丢失。
您可以选择持久化所需的对象。一种方法是在关闭之前将对象序列化为文件,然后在启动时重新加载它们。
在您的情况下,一种简单的方法是使用Java serialization。您需要将可序列化的类标记为实现Serializable
,为其提供serialVersionUID
字段,并使用ObjectOutputStream
和ObjectInputStream
。
顺便说一句,您的Users
类代表两种不同的东西 - 一组用户和一个用户。如果每个类代表一个概念,通常事情会更好。考虑将您的Users
类拆分为两个类,其中一个包含用户列表,另一个表示单个用户。