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

标签 java loops object static instance

我在更改嵌套循环中的类变量的值时遇到问题 - 我不明白为什么。我猜这是因为该变量是静态。但它是一个静态方法,因为它用于从文件列出系统中的用户,所以它必须是静态的(我从主方法调用它以将文件读取到 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();
    }
}
}

这是供引用的输入行:

John,Doe,8012311213-2-a book,Author,Authorson,1234567890123,another book,Author,Authorson,2345678901234-1-a returned book,Author,Authorson,3456789012345

打印上面一行时我希望得到什么:

Current Loans:
1. a book by Author Authorson (1234567890123)
2. another book by Author Authorson (2345678901234)

Returned Loans:
1. a returned book by Author Authorson (3456789012345)

我目前得到的:

Current Loans:
1. a book by Author Authorson (1234567890123)
2. a book by Author Authorson (1234567890123)

Returned Loans:
1. a book by Author Authorson (1234567890123)

还有

readLoans();
System.out.println(loanList.get(2).currentLoans.get(1).toString());
System.out.println(loanList.get(2).currentLoans.get(2).toString());

返回

a returned book by Author Authorson (3456789012345)
a returned book by Author Authorson (3456789012345)

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

最佳答案

从这里开始,很难理解你怎么能理解得这么多,同时又如此困惑。我这么说并不是要侮辱您,只是想说我根本不确定我是否理解您的处境。

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

关于java - 更改嵌套循环中静态类变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20778881/

相关文章:

java - Java注解的语法

java - 为什么Java要进行字节码校验?

java - 如何在用户什么都不输入时继续提示用户

java - 在循环中使用 "continue"是反模式吗?

powershell - 在Powershell中格式化带有列的文本文件

javascript - 如何根据对象或 iframe 内容的长度动态更改其长度

java - IBM MobileFirst v8 登录 validator 的 LDAPS 配置

java - 二维数组,使用 HashMap 的最佳平均计算器

php - 跳过当前迭代

javascript - 如果我只有对该属性的引用,我可以得到该属性的对象吗?