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

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

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

这一案例深刻揭示了面向对象设计中的核心原则:尊重对象生命周期,谨慎区分“创建”与“引用”。初学者常因过度依赖构造器而忽略参数传递的语义价值——记住:传进来的对象,通常就是该被使用的那个对象。