Java 中 Garage 类的汽车存储逻辑错误及修复指南

本文详解 java 初学者在实现 garage(车库)类时常见的对象引用错误:`wprowadzsamochod()` 方法误创建新 `samochod` 实例而非存储传入对象,导致打印默认值(如 "nieznany"),并提供完整修复方案与最佳实践。

在面向对象编程中,正确传递和存储对象引用是基础却关键的一环。你遇到的问题——调用 g1.wprowadzSamochod(s1) 后,g1.wypiszInfo() 却输出 "Marka: nieznany" 而非 "Marka: Fiat"——根本原因在于 Garaz.wprowadzSamochod() 方法中未使用传入的 Samochod s 对象,而是错误地调用了 new Samochod() 构造器,从而生成了一个全新的、仅含默认值的对象。

? 问题定位:错误的实例创建

查看原始 Garaz 类中的 wprowadzSamochod 方法:

public void wprowadzSamochod(Samochod s) {
    if (liczbaSamochodow >= pojemnosc) {
        System.out.println("W garazu jest maksymalna ilość pojazdow.");
    } else {
        samochody[liczbaSamochodow] = new Samochod(); // ❌ 错误!新建了空对象
        liczbaSamochodow++;
        System.out.println("Samochod zostal wprowadzony.");
    }
}

这里 new Samochod() 触发的是无参构造器,它将所有字段设为默认值("nieznany"、0、0.0 等)。无论你传入多么完整的 s1(Fiat 126p),它都被完全忽略——s 参数形同虚设。

✅ 正确做法:直接赋值引用

只需将 new Samochod() 替换为参数 s,即可将外部创建的、已初始化的汽车对象存入数组:

public void wprowadzSamochod(Samochod s) {
    if (liczbaSamochodow >= pojemnosc) {
        System.out.println("W garazu jest maksymalna ilość pojazdow.");

} else { samochody[liczbaSamochodow] = s; // ✅ 正确:保存传入的对象引用 liczbaSamochodow++; System.out.println("Samochod zostal wprowadzony."); } }
? 原理说明:Java 中对象变量本质上是引用(reference)。s 指向堆内存中已构造好的 Samochod 实例,samochody[i] = s 是将该引用复制到数组中,不涉及任何拷贝或重建。

?️ 额外优化建议

  1. 修正 wypiszInfo() 的循环边界
    原代码 for(int i = 0; i

    public void wypiszInfo() {
        if (liczbaSamochodow == 0) {
            System.out.println("Garaz jest pusty.");
            return;
        }
        for (int i = 0; i < liczbaSamochodow; i++) { // ✅ 使用 i < liczbaSamochodow
            if (samochody[i] != null) {
                samochody[i].wypiszInfo();
                System.out.println("---"); // 可选:分隔不同车辆
            }
        }
    }

  2. 增强健壮性:避免空指针异常(NPE)
    虽然本例中 wprowadzSamochod() 已确保不存 null,但 wyprowadzSamochod() 会置 null,因此 wypiszInfo() 中添加 if (samochody[i] != null) 判断是良好实践。

  3. 构造器一致性检查
    注意 Garaz(String, int) 构造器中存在一个潜在 typo:

    samochody = new Samochod[pojemnosc]; // ✅ 正确使用 pojemnosc

    (原代码中此处无误,但需确认——曾有版本误写为 pojemnosc_,务必核对)

? 验证修复效果

修复后运行原 main 方法,g1.wypiszInfo() 将正确输出:

Samochod zostal wprowadzony.
Marka: Fiat
Model: 126p
Ilosc drzwi: 2
Pojemnosc silnika: 650
Srednie spalanie: 6.0

后续 g2 的多车操作(包括重复存取、wyprowadzSamochod())也将按预期工作。

✅ 总结

问题现象 根本原因 修复动作
打印默认值("nieznany", 0)而非实际设置值 wprowadzSamochod() 中 new Samochod() 覆盖了传入对象 s 将 samochody[i] = new Samochod() 改为 samochody[i] = s
循环逻辑冗余易错 使用 i 统一采用 i

掌握“传参即引用”这一核心概念,是避免此类逻辑陷阱的关键。记住:除非明确需要副本,否则永远优先复用传入的对象引用,而非新建实例。