
本文详解java中因误用构造方法导致对象信息丢失的典型问题,重点说明在集合操作中应直接引用传入对象而非新建实例,并提供可立即修复的代码修正方案。
在面向对象编程实践中,一个看似微小的构造调用错误,往往会导致整个数据流失效。本例中,Garaz.wprowadzSamochod(Samochod s) 方法本意是将外部创建好的 Samochod 实例(如 s1 = new Samochod("Fiat", "126p", ...))存入车库数组,但实际代码却错误地执行了:
samochody[liczbaSamochodow] = new Samochod(); // ❌ 创建全新默认实例
这行代码完全忽略了参数 s,转而调用 Samochod() 无参构造器,导致所有字段被初始化为 "nieznany"、0、0.0 等默认值——因此后续 wypiszInfo() 输出的自然是空壳信息,而非用户设定的真实汽车数据。
✅ 正确做法是直接赋值引用,保留原始对象状态:
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.");
}
}此外,Garaz.wypiszInfo() 中的循环条件也存在边界风险:
立即学习“Java免费学习笔记(深入)”;
for(int i = 0; i <= liczbaSamochodow-1; i++) { ... } // ❌ 易引发索引越界或逻辑冗余推荐改写为更安全、更符合Java习惯的写法:
public void wypiszInfo() {
if (liczbaSamochodow == 0) {
System.out.println("Garaz jest pusty.");
return;
}
for (int i = 0; i < liczbaSamochodow; i++) { // ✅ 清晰、安全、标准
if (samochody[i] != null) {
samochody[i].wypiszInfo();
}
}
}⚠️ 注意事项: Java中对象变量本质是引用,samochody[i] = s 不会复制对象,仅保存指向原对象的指针; 若需深拷贝(如防止外部修改影响车库内状态),才需显式调用拷贝构造器或clone(),但本场景无需; 始终对数组访问做 null 检查(尤其在动态增删后),避免 NullPointerException; 构造器命名应语义明确:当前 Samochod(String, String, ...) 是全参构造器,而 Samochod() 是默认构造器,二者职责不可混淆。
修复后,运行原 main 方法即可正确输出:
Marka: Fiat Model: 126p Ilosc drzwi: 2 Pojemnosc silnika: 650 Srednie spalanie: 6.0
这一案例深刻揭示了面向对象设计中的核心原则:尊重对象生命周期,谨慎区分“创建”与“引用”。初学者常因过度依赖构造器而忽略参数传递的语义价值——记住:传进来的对象,通常就是该被使用的那个对象。










