Java 更改嵌套循环中静态类变量的值

Java 更改嵌套循环中静态类变量的值,java,loops,object,static,instance,Java,Loops,Object,Static,Instance,在嵌套循环中更改类变量的值时,我遇到了一个问题-我不知道为什么。我猜这是因为变量是静态的。但它是一个静态方法,因为它用于从文件中列出系统中的用户,所以它必须是静态的(我从main方法调用它来将文件读取到TreeMaps)。不可能从方法中重写静态类变量吗?如果可能的话,我到底做错了什么 public class Loan{ protected int noOfLoans; protected int noOfReturns; protected User user=new User(); pro

在嵌套循环中更改类变量的值时,我遇到了一个问题-我不知道为什么。我猜这是因为变量是静态的。但它是一个静态方法,因为它用于从文件中列出系统中的用户,所以它必须是静态的(我从main方法调用它来将文件读取到TreeMaps)。不可能从方法中重写静态类变量吗?如果可能的话,我到底做错了什么

public class Loan{

protected int noOfLoans;
protected int noOfReturns;
protected User user=new User();
protected static Book book= new Book();
protected Map <Integer, Book> currentLoans=new TreeMap <Integer, Book>();
protected Map <Integer, Book> returned=new TreeMap <Integer, Book>();   
protected static Map<Integer, Loan> loanList=new TreeMap<Integer, Loan>();

public static void main(String[] args){
    readLoans();
}

public static void readLoans(){
    loanList.clear();
    BufferedReader reader = null;
    try {
        reader=new BufferedReader(new FileReader("loans.txt"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    String line = null;
    try {
        line = reader.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }
    while (line!=null) {
        String[] splitOut=line.split("-");
        String[] loan_User=splitOut[0].split(",");
        String[] loan_CurrentLoans=splitOut[2].split(",");
        String[] loan_Returned=splitOut[4].split(",");
        Loan loan = new Loan();
        loan.user.setFirstName(loan_User[0]);
        loan.user.setSurname(loan_User[1]);
        loan.user.setPersonalID(loan_User[2]);
        for (int i = 1; i <= Integer.parseInt(splitOut[1]); i++) {
            book.setName(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)]);
            book.setAuthorFirstname(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)+1]);
            book.setAuthorSurname(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)+2]);
            book.setISBN(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)+3]);
            loan.currentLoans.put(i, book);
        }
        for (int i = 1; i <= Integer.parseInt(splitOut[3]); i++) {
            book.setName(loan_Returned[((Integer.parseInt
                    (splitOut[3])-1)*4)]);
            book.setAuthorFirstname(loan_Returned[((Integer.parseInt
                    (splitOut[3])-1)*4)+1]);
            book.setAuthorSurname(loan_Returned[((Integer.parseInt
                    (splitOut[3])-1)*4)+2]);
            book.setISBN(loan_Returned[((Integer.parseInt
                    (splitOut[3])-1)*4)+3]);
            loan.returned.put(i, book);
        }
        loan.setNoOfLoans(Integer.parseInt(splitOut[1]));
        loan.setNoOfReturns(Integer.parseInt(splitOut[3]));
        loanList.put(loanList.size()+1, loan);
        try {
            line=reader.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try {
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}
我希望在行上打印时得到的是:

当前贷款:
1.作者的书(1234567890123)
2.作者的另一本书(2345678901234)
归还贷款:
1.作者归还的书(3456789012345)
我目前得到的是:

当前贷款:
1.作者的书(1234567890123)
2.作者的书(1234567890123)
归还贷款:
1.作者的书(1234567890123)

返回

作者归还的书(3456789012345)
作者归还的书(3456789012345)

这让我相信我实际上无法创建静态Book对象的实例,但必须使其非静态,并尝试在方法中创建对象的实例。如果是这样的话——我该怎么做呢?

从这里开始,很难理解你怎么能像现在这样理解,同时又会如此困惑。我不是想侮辱你,只是想说我根本不知道你在哪里


使用
new
创建实例。因此,在两个循环中,您不断覆盖一个静态书本,相反,您需要一个局部变量,将
新的
书本分配给它,然后设置字段。

问题不在于您的书本是静态的,而更简单的是,每次在循环中更改它时,它都是同一个对象。之所以会发生这种情况,是因为您将其声明为静态场,但您的想法是错误的

让我们把问题简化,用这本书来说明:

class AnObject {
    int aValue;
}
而不是IO,只需循环几次并将其添加到列表中:

class PersistenceOfChangesDemo {
    static List<AnObject> theList = new ArrayList<AnObject>();

    public static void main(String[] args) {
        AnObject theObject = new AnObject();

        for(int i = 1; i <= 3; i++) {
            /* reassign the object's value */
            theObject.aValue = i;
            /* adds the same object each time */
            theList.add(theObject);
        }

        /* theList is now of size 3
         * but all its elements refer to the same object (theObject) */
        for(AnObject anObject : theList) {
            /* prints '3' every time
             * because that was the last value assigned */
            System.out.println(anObject.aValue);
            /* prints 'true' every time */
            System.out.println(anObject == theObject);
        }
    }
}
ChangesDemo的类持久性{
静态列表列表=新的ArrayList();
公共静态void main(字符串[]args){
AnObject theObject=新的AnObject();

对于(inti=1;i这只是参考问题。这三个都是指同一个对象
静态书籍
,因此表示最后插入的相同细节

更改只是创建
Book()
的新对象,而不是对不同的细节使用相同的对象

试试下面的代码

Loan loan = new Loan();
        loan.user.setFirstName(loan_User[0]);
        loan.user.setSurname(loan_User[1]);
        loan.user.setPersonalID(loan_User[2]);
        for (int i = 1; i <= Integer.parseInt(splitOut[1]); i++) {
            book = new Book();          // added this line
            book.setName(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)]);
            book.setAuthorFirstname(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)+1]);
            book.setAuthorSurname(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)+2]);
            book.setISBN(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)+3]);
            loan.currentLoans.put(i, book);
        }
        for (int i = 1; i <= Integer.parseInt(splitOut[3]); i++) {
                book = new Book();           // added this line
            book.setName(loan_Returned[((Integer.parseInt
                    (splitOut[3])-1)*4)]);
            book.setAuthorFirstname(loan_Returned[((Integer.parseInt
                    (splitOut[3])-1)*4)+1]);
贷款=新贷款();
loan.user.setFirstName(loan_user[0]);
loan.user.setSurname(loan_user[1]);
loan.user.setPersonalID(loan_user[2]);
对于(inti=1;i我是如何解决的

public static void readLoans(){
    // Reads the bookList and userList.
    readBooks();
    readUsers();
    // Creates a new BufferedReader and tries to read "loans.txt"
    BufferedReader reader = null;
    try {
        reader=new BufferedReader(new FileReader("loans.txt"));
    }
    // Catches exception if "books.txt" does not exist.
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    String line = null;
    // tries to read the first line and interpret it as a String.
    try {
        line = reader.readLine();
    } 
    // Catches IOexception if any is thrown when trying to read line.
    catch (IOException e) {
        e.printStackTrace();
    }
    // Loop as long as "line" is not empty, i.e. as long as a Loan is read.
    while (line!=null) {
        // split the String "line" at every RegEx "-"
        String[] splitOut=line.split("-");
        // Create a String from the first index of the first split.
        String user = splitOut[0];
        /* Split the second and third index of the first split and create
         * new Stringarrays from them.*/
        String[] loans = splitOut[1].split(",");
        String[] returns = splitOut[2].split(",");
        User aUser = new User();
        /* Find the user in the userList whose personal ID matches the 
         * String "user" that we created. This is the user that we want to
         * create (a) loan/s and/or (a) returned loan/s for.*/
        for (int i = 1; i < userList.size()+1; i++) {
            if (userList.get(i).getPersonalID().equals(user)) {
                /*Set the variables for the User.*/
                aUser.setFirstname(userList.get(i).getFirstname());
                aUser.setSurname(userList.get(i).getSurname());
                aUser.setPersonalID(userList.get(i).getPersonalID());
                aUser.setTelephone(userList.get(i).getTelephone());
                aUser.setLoans(userList.get(i).getLoans());
                aUser.setReturns(userList.get(i).getReturns());
                // Create an ArrayList for Loans and Returns for every user
                ArrayList<Loan> listOfloans = new ArrayList<Loan>();
                ArrayList<Loan> listOfreturns = new ArrayList<Loan>();
                // if the new user has any loans...
                for (int j = 0; j < aUser.getLoans(); j++) {
                    for (int k = 1; k < bookList.size()+1; k++) {
                        /* ... find the "Book" object with the
                         * corresponding ISBN...*/
                        if (bookList.get(k).getIsbn().equals(loans[j*3])) {
                            // ...then create a new loan object for each...
                            Loan loan = new Loan();
                            // ...and set the variables of each loan...
                            loan.setTitle(bookList.get(k).getTitle());
                            loan.setAuthor_firstname(bookList.get(k).
                                    getAuthor_firstname());
                            loan.setAuthor_surname(bookList.get(k).
                                    getAuthor_surname());
                            try {
                                loan.setIsbn(bookList.get(k).getIsbn());
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            loan.setMaxLoan(bookList.get(k).getMaxLoan());
                            loan.setOnLoan(bookList.get(k).getOnLoan());
                            loan.setAvailable(bookList.get(k).
                                    getAvailable());
                            loan.setSignature(loans[j*3+1]);
                            loan.setTimestamp(loans[j*3+2]);
                            /* ...then add each one to the "listOfloans"
                             * ArrayList.*/
                            listOfloans.add(loan);
                        }
                    }
                }
                /* if the "listOfloans" ArrayList is not empty, 
                 * add the loan to loanList with User as Key.*/
                if (!listOfloans.isEmpty()) {
                    loanList.put(aUser, listOfloans);
                }
                // if the new user has any returned loans...
                for (int j = 0; j < aUser.getReturns(); j++) {
                    for (int k = 1; k < bookList.size()+1; k++) {
                        /* ... find the "Book" object with the
                         * corresponding ISBN...*/
                        if(bookList.get(k).getIsbn().equals(returns[j*4])){
                            // ...then create a new loan object for each...
                            Loan loan = new Loan();
                            // ...and set the variables of each loan...
                            loan.setTitle(bookList.get(k).getTitle());
                            loan.setAuthor_firstname(bookList.get(k).
                                    getAuthor_firstname());
                            loan.setAuthor_surname(bookList.get(k).
                                    getAuthor_surname());
                            try {
                                loan.setIsbn(bookList.get(k).getIsbn());
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            loan.setMaxLoan(bookList.get(k).getMaxLoan());
                            loan.setOnLoan(bookList.get(k).getOnLoan());
                            loan.setAvailable(bookList.get(k)
                                    .getAvailable());
                            loan.setSignature(returns[j*4+1]);
                            loan.setTimestamp(returns[j*4+2]);
                            loan.setReturndate(returns[j*4+3]);
                            /* ...then add each one to the "listOfreturns"
                             * ArrayList.*/
                            listOfreturns.add(loan);
                        }
                    }
                }
                /* if the "listOfreturns" ArrayList is not empty, 
                 * add the returned loan to returnList with User as Key.*/
                if (!listOfreturns.isEmpty()) {
                    returnList.put(aUser, listOfreturns);   
                }
            }
        }
        // tries to read the next line and interpret it as a String.
        try {
            line=reader.readLine();
        }
        // Catches IOexception if any is thrown when trying to read line.
        catch (IOException e) {
            e.printStackTrace();
        }
    }
    // try to close the BufferedReader.
    try {
        reader.close();
    }
    // Catches IOexception if any is thrown when trying to close.
    catch (IOException e) {
        e.printStackTrace();
    }
}
publicstaticvoidreadloans(){
//读取bookList和userList。
阅读书籍();
readUsers();
//创建新的BufferedReader并尝试读取“loans.txt”
BufferedReader reader=null;
试一试{
reader=newbufferedreader(newfilereader(“loans.txt”);
}
//如果“books.txt”不存在,则捕获异常。
catch(filenotfounde异常){
e、 printStackTrace();
}
字符串行=null;
//尝试读取第一行并将其解释为字符串。
试一试{
line=reader.readLine();
} 
//捕获IOexception,如果在尝试读取行时抛出任何异常。
捕获(IOE异常){
e、 printStackTrace();
}
//循环,只要“行”不为空,即只要读取贷款。
while(行!=null){
//在每个正则表达式“-”处拆分字符串“line”
String[]splitOut=line.split(“-”);
//从第一次拆分的第一个索引创建字符串。
字符串user=splitOut[0];
/*拆分第一次拆分的第二个和第三个索引并创建
*新的StringArray将从中删除*/
String[]loans=splitOut[1]。split(“,”);
字符串[]返回=splitOut[2]。split(,“”);
用户aUser=新用户();
/*在userList中查找其个人ID与
*我们创建的字符串“user”。这是我们要创建的用户
*为创建(a)贷款和/或(a)退回的贷款*/
对于(int i=1;ifor (int i = 1; i <= Integer.parseInt(splitOut[1]); i++) {
    Book newBook = new Book();

    newBook.setName(loan_CurrentLoans[((Integer.parseInt
            (splitOut[1])-1)*4)]);
    newBook.setAuthorFirstname(loan_CurrentLoans[((Integer.parseInt
            (splitOut[1])-1)*4)+1]);
    newBook.setAuthorSurname(loan_CurrentLoans[((Integer.parseInt
            (splitOut[1])-1)*4)+2]);
    newBook.setISBN(loan_CurrentLoans[((Integer.parseInt
            (splitOut[1])-1)*4)+3]);
    loan.currentLoans.put(i, newBook);
}
Loan loan = new Loan();
        loan.user.setFirstName(loan_User[0]);
        loan.user.setSurname(loan_User[1]);
        loan.user.setPersonalID(loan_User[2]);
        for (int i = 1; i <= Integer.parseInt(splitOut[1]); i++) {
            book = new Book();          // added this line
            book.setName(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)]);
            book.setAuthorFirstname(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)+1]);
            book.setAuthorSurname(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)+2]);
            book.setISBN(loan_CurrentLoans[((Integer.parseInt
                    (splitOut[1])-1)*4)+3]);
            loan.currentLoans.put(i, book);
        }
        for (int i = 1; i <= Integer.parseInt(splitOut[3]); i++) {
                book = new Book();           // added this line
            book.setName(loan_Returned[((Integer.parseInt
                    (splitOut[3])-1)*4)]);
            book.setAuthorFirstname(loan_Returned[((Integer.parseInt
                    (splitOut[3])-1)*4)+1]);
public static void readLoans(){
    // Reads the bookList and userList.
    readBooks();
    readUsers();
    // Creates a new BufferedReader and tries to read "loans.txt"
    BufferedReader reader = null;
    try {
        reader=new BufferedReader(new FileReader("loans.txt"));
    }
    // Catches exception if "books.txt" does not exist.
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    String line = null;
    // tries to read the first line and interpret it as a String.
    try {
        line = reader.readLine();
    } 
    // Catches IOexception if any is thrown when trying to read line.
    catch (IOException e) {
        e.printStackTrace();
    }
    // Loop as long as "line" is not empty, i.e. as long as a Loan is read.
    while (line!=null) {
        // split the String "line" at every RegEx "-"
        String[] splitOut=line.split("-");
        // Create a String from the first index of the first split.
        String user = splitOut[0];
        /* Split the second and third index of the first split and create
         * new Stringarrays from them.*/
        String[] loans = splitOut[1].split(",");
        String[] returns = splitOut[2].split(",");
        User aUser = new User();
        /* Find the user in the userList whose personal ID matches the 
         * String "user" that we created. This is the user that we want to
         * create (a) loan/s and/or (a) returned loan/s for.*/
        for (int i = 1; i < userList.size()+1; i++) {
            if (userList.get(i).getPersonalID().equals(user)) {
                /*Set the variables for the User.*/
                aUser.setFirstname(userList.get(i).getFirstname());
                aUser.setSurname(userList.get(i).getSurname());
                aUser.setPersonalID(userList.get(i).getPersonalID());
                aUser.setTelephone(userList.get(i).getTelephone());
                aUser.setLoans(userList.get(i).getLoans());
                aUser.setReturns(userList.get(i).getReturns());
                // Create an ArrayList for Loans and Returns for every user
                ArrayList<Loan> listOfloans = new ArrayList<Loan>();
                ArrayList<Loan> listOfreturns = new ArrayList<Loan>();
                // if the new user has any loans...
                for (int j = 0; j < aUser.getLoans(); j++) {
                    for (int k = 1; k < bookList.size()+1; k++) {
                        /* ... find the "Book" object with the
                         * corresponding ISBN...*/
                        if (bookList.get(k).getIsbn().equals(loans[j*3])) {
                            // ...then create a new loan object for each...
                            Loan loan = new Loan();
                            // ...and set the variables of each loan...
                            loan.setTitle(bookList.get(k).getTitle());
                            loan.setAuthor_firstname(bookList.get(k).
                                    getAuthor_firstname());
                            loan.setAuthor_surname(bookList.get(k).
                                    getAuthor_surname());
                            try {
                                loan.setIsbn(bookList.get(k).getIsbn());
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            loan.setMaxLoan(bookList.get(k).getMaxLoan());
                            loan.setOnLoan(bookList.get(k).getOnLoan());
                            loan.setAvailable(bookList.get(k).
                                    getAvailable());
                            loan.setSignature(loans[j*3+1]);
                            loan.setTimestamp(loans[j*3+2]);
                            /* ...then add each one to the "listOfloans"
                             * ArrayList.*/
                            listOfloans.add(loan);
                        }
                    }
                }
                /* if the "listOfloans" ArrayList is not empty, 
                 * add the loan to loanList with User as Key.*/
                if (!listOfloans.isEmpty()) {
                    loanList.put(aUser, listOfloans);
                }
                // if the new user has any returned loans...
                for (int j = 0; j < aUser.getReturns(); j++) {
                    for (int k = 1; k < bookList.size()+1; k++) {
                        /* ... find the "Book" object with the
                         * corresponding ISBN...*/
                        if(bookList.get(k).getIsbn().equals(returns[j*4])){
                            // ...then create a new loan object for each...
                            Loan loan = new Loan();
                            // ...and set the variables of each loan...
                            loan.setTitle(bookList.get(k).getTitle());
                            loan.setAuthor_firstname(bookList.get(k).
                                    getAuthor_firstname());
                            loan.setAuthor_surname(bookList.get(k).
                                    getAuthor_surname());
                            try {
                                loan.setIsbn(bookList.get(k).getIsbn());
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            loan.setMaxLoan(bookList.get(k).getMaxLoan());
                            loan.setOnLoan(bookList.get(k).getOnLoan());
                            loan.setAvailable(bookList.get(k)
                                    .getAvailable());
                            loan.setSignature(returns[j*4+1]);
                            loan.setTimestamp(returns[j*4+2]);
                            loan.setReturndate(returns[j*4+3]);
                            /* ...then add each one to the "listOfreturns"
                             * ArrayList.*/
                            listOfreturns.add(loan);
                        }
                    }
                }
                /* if the "listOfreturns" ArrayList is not empty, 
                 * add the returned loan to returnList with User as Key.*/
                if (!listOfreturns.isEmpty()) {
                    returnList.put(aUser, listOfreturns);   
                }
            }
        }
        // tries to read the next line and interpret it as a String.
        try {
            line=reader.readLine();
        }
        // Catches IOexception if any is thrown when trying to read line.
        catch (IOException e) {
            e.printStackTrace();
        }
    }
    // try to close the BufferedReader.
    try {
        reader.close();
    }
    // Catches IOexception if any is thrown when trying to close.
    catch (IOException e) {
        e.printStackTrace();
    }
}