如何正确将对象存入数组:避免在Java中意外创建默认实例

本文详解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() 方法中的循环条件也存在潜在风险:

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中,传参即传引用,保存即存地址,修改需谨慎,复制要明确