You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类,让它能直接操作这两个列表。具体步骤如下:

  1. 修复Car类的name字段,改成实例变量(去掉static),每个车有自己的名字。
  2. 给Traffic类添加构造方法,接收两个车辆列表作为参数,保存为成员变量。
  3. 在main方法里创建Traffic实例时,把两个列表传进去,然后调用trafficLights方法。
  4. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:12:35