如何在子类构造器中创建并访问父类私有属性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č
相关产品推荐
相关产品推荐

