
本文详解java中因误用构造器导致对象信息丢失的常见错误,重点解决“向车库数组添加汽车时却显示默认值”的问题,并提供修复方案与最佳实践。
在面向对象编程中,将已有对象存入容器(如数组)时,必须确保引用的是原始对象本身,而非无意中创建新实例。您遇到的问题正源于 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)的新 Samochod 实例,完全丢弃了传入参数 s 的实际数据。因此,后续调用 wypiszInfo() 时自然输出的是默认信息。
✅ 正确做法是直接将传入的 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.");
}
}此外,wypiszInfo() 方法中的循环条件也存在潜在风险:
立即学习“Java免费学习笔记(深入)”;
for(int i = 0; i <= liczbaSamochodow-1; i++) { ... }当 liczbaSamochodow == 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();
}
}
}
⚠️ 注意事项: Java中对象变量本质是引用(reference),赋值 samochody[i] = s 并未复制对象,而是共享同一内存地址; 若需深拷贝(独立副本),应实现 Cloneable 或使用构造器/工厂方法显式复制; 始终对数组元素做非空校验(如 if (samochody[i] != null)),避免 NullPointerException; 类名 Samochod 和 Garaz 建议遵循Java命名规范改为驼峰式(如 Samochod → Car,Garaz → Garage),提升代码可维护性。
修复后,您的主程序将正确输出:
Samochod zostal wprowadzony. Marka: Fiat Model: 126p Ilosc drzwi: 2 Pojemnosc silnika: 650 Srednie spalanie: 6.0
这不仅是语法修正,更是对“引用语义”和“对象生命周期”理解的关键一步——在Java中,传参即传引用,保存即存地址,修改需谨慎,复制要明确。










