You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在子类构造器中创建并访问父类私有属性predmeti[]

嘿,我来帮你搞定这两个Java继承相关的问题!

问题1:子类访问父类属性并在子类构造器中创建该属性的通用解法

首先得明确一个关键知识点:父类的private属性是子类无法直接访问的——这是面向对象封装性的核心要求。所以要实现你的需求,得通过父类提供的公共/受保护的接口来操作,常见的有两种靠谱方案:

  • 方案1:父类提供带属性初始化参数的构造器
    让父类定义一个构造器,接收用来初始化目标属性的参数,子类通过super()调用这个构造器,把初始化值传给父类,由父类完成属性的创建和赋值。这是最符合封装原则的做法。
  • 方案2:父类提供protected的setter/初始化方法
    如果父类没有合适的构造器,可以在父类中写一个protected修饰的方法(比如setXXX(...)或者initXXX(...)),子类在构造器里调用这个方法,间接完成父类属性的初始化。

⚠️ 不推荐直接把父类的private属性改成protected,这会破坏封装性,让父类的内部实现细节暴露给子类,增加代码耦合度,后期维护会很麻烦。

问题2:针对HladilniZabojnik子类的具体实现

回到你的代码,父类Zabojnik里的predmeti是private Object[],子类没法直接创建这个数组。这里给你两种可行的实现方案,你可以根据实际需求选择:

方案1:修改父类构造器,让父类负责初始化数组

这种方案最合理,因为数组的大小依赖于父类的maksimalnoSteviloPredmetov属性,初始化逻辑应该属于父类的职责。

首先修改父类Zabojnik,在构造器中添加数组初始化逻辑:

public class Zabojnik {
    private String oznaka;
    private int maksimalnaTeza;
    private int maksimalnoSteviloPredmetov;
    private Object predmeti[];

    // 完善构造器,初始化所有属性,包括predmeti数组
    public Zabojnik(String oznaka, int maksimalnoSteviloPredmetov, int maksimalnaTeza) {
        this.oznaka = oznaka;
        this.maksimalnoSteviloPredmetov = maksimalnoSteviloPredmetov;
        this.maksimalnaTeza = maksimalnaTeza;
        // 根据最大物品数量创建对应大小的数组
        this.predmeti = new Object[maksimalnoSteviloPredmetov];
    }
}

然后你的子类HladilniZabojnik不需要做任何额外修改——因为你已经在子类构造器中调用了super(...),父类会自动完成predmeti数组的创建:

public class HladilniZabojnik extends Zabojnik {
    public HladilniZabojnik() {
        // 如果需要无参构造器,调用super时传入默认值即可
        super("默认冷藏柜标识", 20, 100);
    }

    public HladilniZabojnik(String oznaka, int maksimalnoSteviloPredmetov, int maksimalnaTeza) {
        super(oznaka, maksimalnoSteviloPredmetov, maksimalnaTeza);
        // 父类已经在构造器里初始化了predmeti数组,子类无需额外操作
    }
}

方案2:父类提供protected方法,让子类触发数组初始化

如果不想修改父类的现有构造器,可以在父类中添加一个protected的初始化方法,允许子类调用它来创建数组:

修改父类Zabojnik:

public class Zabojnik {
    // 原有属性不变
    private String oznaka;
    private int maksimalnaTeza;
    private int maksimalnoSteviloPredmetov;
    private Object predmeti[];

    // 原有构造器保留
    public Zabojnik(String oznaka, int maksimalnoSteviloPredmetov, int maksimalnaTeza) {
        this.oznaka = oznaka;
        this.maksimalnoSteviloPredmetov = maksimalnoSteviloPredmetov;
        this.maksimalnaTeza = maksimalnaTeza;
    }

    // 提供protected方法,允许子类初始化predmeti数组
    protected void initPredmeti(int arraySize) {
        this.predmeti = new Object[arraySize];
    }
}

然后在子类构造器中调用这个方法:

public class HladilniZabojnik extends Zabojnik {
    public HladilniZabojnik(String oznaka, int maksimalnoSteviloPredmetov, int maksimalnaTeza) {
        super(oznaka, maksimalnoSteviloPredmetov, maksimalnaTeza);
        // 调用父类的protected方法,用传入的最大物品数量作为数组大小
        initPredmeti(maksimalnoSteviloPredmetov);
    }
}

小提醒

如果predmeti数组的初始化逻辑和父类的其他属性(比如maksimalnoSteviloPredmetov)强相关,优先选方案1——让父类自己管理内部属性的初始化,既符合封装原则,也能避免子类重复写相同的逻辑。

内容的提问来源于stack exchange,提问作者žan kovač

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:40:41