跨类引用ArrayList为何为空?Java代码示例求助
问题根源:你创建了两个独立的FirstClass实例
你遇到的问题核心很简单:FirstClass的main方法里的实例,和OtherClass里新建的实例是完全无关的两个对象。
- 运行FirstClass.main时,你创建了一个FirstClass对象
fc,并给它的myList添加了"Test",所以打印有内容。 - 但运行OtherClass.main时,OtherClass里的
csv是一个全新的FirstClass实例——这个实例的myList从来没有被添加过任何元素,自然是空的。FirstClass.main里的操作和这个新实例没有任何关联。
解决方案
根据你的需求,有几种常见的解决方式:
方式1:在FirstClass构造方法中初始化列表内容
让每个新创建的FirstClass实例都自带初始元素:
public class FirstClass { private ArrayList<String> myList = new ArrayList<>(); // 构造方法中添加初始元素 public FirstClass() { myList.add("Test"); } public ArrayList<String> getMyList() { return myList; } public static void main(String[] args) { FirstClass fc = new FirstClass(); System.out.println(fc.getMyList()); } }
此时运行OtherClass,新建的csv实例的myList会自动包含"Test",输出就会是[Test]。
方式2:传递已初始化的FirstClass实例给OtherClass
让OtherClass使用那个已经填充过元素的FirstClass实例,而不是新建一个:
public class OtherClass { private FirstClass csv; public ArrayList<String> otherList; // 通过构造方法接收已初始化的实例 public OtherClass(FirstClass fc) { this.csv = fc; this.otherList = csv.getMyList(); } public static void main(String[] args) { // 先创建并初始化FirstClass实例 FirstClass fc = new FirstClass(); fc.getMyList().add("Test"); // 把这个实例传给OtherClass OtherClass oc = new OtherClass(fc); System.out.println(oc.otherList); } }
这种方式保证OtherClass使用的是同一个被填充过的列表,输出结果为[Test]。
方式3:使用静态列表(谨慎使用)
让所有FirstClass实例共享同一个静态列表,适合需要全局共享数据的场景:
public class FirstClass { // 改为静态列表,所有实例共享 private static ArrayList<String> myList = new ArrayList<>(); public ArrayList<String> getMyList() { return myList; } public static void main(String[] args) { FirstClass fc = new FirstClass(); fc.getMyList().add("Test"); System.out.println(fc.getMyList()); } }
此时无论创建多少个FirstClass实例,它们的getMyList()都会返回同一个列表,OtherClass运行时就能看到已添加的元素。但静态变量要注意线程安全问题,多线程环境下需要额外处理。
内容的提问来源于stack exchange,提问作者Baxter
相关产品推荐
相关产品推荐

