在 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
我想在 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