在 Loop 内部创建多个 Java 对象并在外部使用所有对象

Creating multiple Java objects inside Loop and using all outside

我想在 while 循环中创建多个对象并在 JAVA 8 中访问外部的所有对象。 当前使用列表来存储对象,但所有对象都被最后一个对象(最后创建的)替换。

我已经尝试在 try 内初始化列表,在 try 外初始化列表,但没有任何效果。

这是我的 test1.java,

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class test1 {
public static void main(String[] args){
    try {
        List<test2> objList=new ArrayList<>();
        BufferedReader encReader = new BufferedReader(new FileReader("./asd.txt"));
        String eachLine;
        while ((eachLine = encReader.readLine()) != null) {
            String[] data = eachLine.split("\|");
            if(true){
                objList.add(new test2(data[0], data[1]));
            }
        }   // While ends here

        objList.forEach(x -> x.printEncLoc());

    }catch (IOException e) {
        e.printStackTrace();
    }
}
}

这是我的 test2.java,

public class test2 {
private static String s1;
private static String s2;
test2(String s1new, String s2new){
    s1=s1new;
    s2=s2new;
}
public static void printEncLoc(){
    System.out.println("s1:"+s1+" s2:"+s2);
}
}

这是我的输入文件示例 (asd.txt)

hello|123
qwe|klj

它每次在forEach 行中只调用最后一个对象的printEncLoc 函数。 它打印输出如下。

s1:qwe s2:klj
s1:qwe s2:klj

这里有什么问题?

您将 test2 中的属性设为静态,这意味着所有实例共享相同的属性。因此,当您为第二行更改它们时,第一行也会更改。

从 s1 和 s2 以及您的 printEncLoc() 方法中删除 'static',您的代码就可以工作了。

编辑:有关静态工作原理的更多信息,请参阅 https://www.baeldung.com/java-static