Java中内部和外部循环定义对象的不同之处

Had*_*iRj 0 java loops

今天我正在努力学习我的部分代码,从文件中读取一些数据并将它们作为属性添加到对象中(我知道如何在没有这个麻烦的情况下添加/读取文件中的对象,但是想要这样做)如下:

文件是这样的:

111,john,23.1
222,jack,22.5
234,adam,12.8
Run Code Online (Sandbox Code Playgroud)

我试图使用以下内容读取此文件:

public ArrayList<Staff> LoadAllStaffs(){
    ArrayList<Staff> staffs = new ArrayList<Staff>();
    File file = new File(stafffile);
    Staff tmpstaff = new Staff();
    try {
        BufferedReader inputfile = new BufferedReader(new FileReader(stafffile));
        String tmp;
        while((tmp = inputfile.readLine()) != null){
            StringTokenizer st = new StringTokenizer(tmp , ",");
            tmpstaff.setID(Integer.valueOf(st.nextToken()));
            tmpstaff.setFirstName(st.nextToken());
            tmpstaff.setSalary(Double.valueOf(st.nextToken()));
            staffs.add(tmpstaff);
            }
        } 
    catch (IOException e) {
    }
    return staffs;
}
Run Code Online (Sandbox Code Playgroud)

使用println从返回的arraylist中显示此输出:

234,adam,12.8
234,adam,12.8
234,adam,12.8
Run Code Online (Sandbox Code Playgroud)

我只是移动了printlnwhile循环内部,它显示了它应该是什么.

为什么会这样?我在这里读到 - 在循环内部或外部定义变量(好吧,这里是一个对象)没有任何区别.

SJu*_*n76 5

您没有Staff在循环内创建新实例,而是在所有迭代中重用相同的实例.因此,您将覆盖值并添加相同的对象.

移动

Staff tmpstaff = new Staff();
Run Code Online (Sandbox Code Playgroud)

到循环内的第一行.

更新:为了解决Vash这个问题,这里的问题可以解释为,如果你想存储3个对象,你需要创建这样的3个对象.您可以重用引用(tmpstaff变量)并有效地定义它并不重要(只要对它的所有引用都在同一范围内.但您必须创建3个对象,这意味着3个new命令.

更新2:为了使事情更简单,文本I read -even here- that defining variables (well, here its an Object ) inside or outside loops doesn't make any difference.意味着

File file = new File(stafffile);
Staff tmpstaff = null; // or simpler, Staff tmpstaff;
try {
   ...
   while((tmp = inputfile.readLine()) != null){
     tmpstaff = new Staff();
     ...
Run Code Online (Sandbox Code Playgroud)

   while((tmp = inputfile.readLine()) != null){
     Staff tmpstaff = new Staff();
     ...
Run Code Online (Sandbox Code Playgroud)

是等价的.