Java新手技术问询:如何在Traffic类中访问Car类中的列表以实现循环至列表为空的逻辑
解决Traffic类访问Car类中列表的问题
嘿,我来帮你理清楚这个问题哈!你现在遇到的核心问题是变量作用域和类之间的关系设计搞错了,咱们一步步来解决:
先说说你当前代码里的几个关键问题
waiting_cars是Car类main方法里的局部变量,局部变量只能在定义它的方法内部使用,哪怕Traffic继承了Car也访问不到——因为继承能拿到的是类的成员变量/方法,不是方法里的局部变量。- 让
Traffic继承Car完全没必要,这两个类是不同的角色:Car是车辆实体,Traffic是交通灯管理者,应该是Traffic来管理车辆列表,而不是变成一种车辆。 - 你代码里还有语法错误:
main方法里after_light那行末尾多了个);另外Car类的name是static的,这会导致所有Car实例共享同一个名字,每个新创建的车都会覆盖之前的名字,这肯定不是你想要的。
正确的解决方案:让Traffic持有车辆列表的引用
咱们可以通过依赖注入的方式,把waiting_cars和after_light传递给Traffic类,让它能直接操作这两个列表。具体步骤如下:
- 修复
Car类的name字段,改成实例变量(去掉static),每个车有自己的名字。 - 给
Traffic类添加构造方法,接收两个车辆列表作为参数,保存为成员变量。 - 在
main方法里创建Traffic实例时,把两个列表传进去,然后调用trafficLights方法。 - 修正
while循环的判断方式(直接用!waiting_cars.isEmpty()更简洁规范)。
修正后的完整代码
import java.util.ArrayList; import java.util.List; public class Car { // 改成实例变量,每个Car有自己的名字 private String name; Car(String n) { this.name = n; } // 可以加个getName方法方便后续获取车名 public String getName() { return name; } public static void main(String[] args) { List<Car> waitingCars = new ArrayList<>(); List<Car> afterLight = new ArrayList<>(); // 创建100辆车(注意原来的循环条件是<=99,所以是100辆) for (int i = 0; i < 100; i++) { // 给每辆车起个独特的名字,比如Car-1、Car-2... Car car = new Car("Car-" + (i + 1)); waitingCars.add(car); } System.out.println("初始等待车辆数:" + waitingCars.size()); // 创建Traffic实例,把两个列表传进去 Traffic traffic = new Traffic(waitingCars, afterLight); // 启动交通灯逻辑 traffic.trafficLights(); } } class Traffic { // 保存外部传入的车辆列表引用 private List<Car> waitingCars; private List<Car> afterLight; // 构造方法接收两个列表 public Traffic(List<Car> waitingCars, List<Car> afterLight) { this.waitingCars = waitingCars; this.afterLight = afterLight; } void trafficLights() { // 用isEmpty()判断列表是否为空,比size() == 0更高效规范 while (!waitingCars.isEmpty()) { // 这里可以写具体的逻辑,比如把第一辆车移到afterLight列表 Car car = waitingCars.remove(0); afterLight.add(car); System.out.println(car.getName() + " 通过了交通灯,剩余等待车辆:" + waitingCars.size()); // 可以加个延迟模拟真实场景,比如每隔1秒过一辆车 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("所有车辆都通过了交通灯!"); } }
补充说明
- 我把变量名改成了
waitingCars和afterLight,这是Java的驼峰命名规范,比下划线分隔更符合行业习惯。 - 在
trafficLights方法里加了车辆移动的逻辑和延迟,让代码更贴近真实场景,你可以根据自己的需求修改这部分逻辑。 - 现在
Traffic类通过构造方法拿到了两个列表的引用,所以能直接操作它们,循环会一直执行到waitingCars为空为止。
内容的提问来源于stack exchange,提问作者Weke Moyosore
相关产品推荐
相关产品推荐

