
本文详解 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,即可将外部创建的、已初始化的汽车对象存入数组:
立即学习“Java免费学习笔记(深入)”;
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 是将该引用复制到数组中,不涉及任何拷贝或重建。
?️ 额外优化建议
修正 wypiszInfo() 的循环边界
原代码 for(int i = 0; ipublic 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("---"); // 可选:分隔不同车辆 } } }增强健壮性:避免空指针异常(NPE)
虽然本例中 wprowadzSamochod() 已确保不存 null,但 wyprowadzSamochod() 会置 null,因此 wypiszInfo() 中添加 if (samochody[i] != null) 判断是良好实践。-
构造器一致性检查
注意 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 |
掌握“传参即引用”这一核心概念,是避免此类逻辑陷阱的关键。记住:除非明确需要副本,否则永远优先复用传入的对象引用,而非新建实例。










