如何在派生类构造函数中使用变量名初始化数组?
如何在派生类构造函数中用变量名初始化数组并传递给基类
要解决这个问题,首先得记住Java的一个关键规则:构造函数中的super()调用必须是第一条执行语句。这意味着你没法先在构造函数里声明数组变量、赋值后再传给super,但我们有两种实用的解决办法:
方案1:用静态工厂方法封装数组初始化(推荐)
把数组的初始化逻辑抽成一个静态方法,这样你可以在super()调用中直接通过方法名(相当于用“变量名”的方式)传递数组,既符合语法要求,又能让代码更整洁。
修改后的派生类代码如下:
public class PalyaTeszt extends Palya{ // 静态方法封装测试数组的初始化逻辑 private static Mezo[][] createTestGrid() { Mezo[][] testGrid = new Mezo[4][6]; // 初始化第一行 testGrid[0] = new Mezo[]{new Szikla(), new Szikla(), new Viz(), new Szikla(), new Szikla(), new Preri(true)}; // 初始化第二行 testGrid[1] = new Mezo[]{new Szikla(), new Szikla(), new Preri(false), new Preri(false), new Preri(false), new Szikla()}; // 初始化第三行 testGrid[2] = new Mezo[]{new Szikla(), new Szikla(), new Preri(false), new Preri(false), new Szikla(), new Szikla()}; // 初始化第四行(补全你的剩余元素) testGrid[3] = new Mezo[]{new Szikla(), /* 这里添加剩下的Mezo实例 */}; return testGrid; } public PalyaTeszt(Mezo[][] m) { super(createTestGrid()); // 直接调用静态方法传递数组 } }
这个方案的优势:
- 不需要修改基类的代码,兼容性更好
- 把复杂的数组初始化逻辑从构造函数中分离出来,代码可读性更高
- 静态方法可以被复用,比如其他地方需要创建相同的测试数组时直接调用即可
方案2:修改基类增加无参构造(仅当基类可修改时使用)
如果允许调整基类的设计,可以给基类添加一个无参构造函数,这样派生类可以先调用无参的super()(满足第一条语句的要求),再正常声明变量、初始化数组,最后给基类的成员变量赋值。
修改后的基类:
public class Palya { Mezo[][] m; public Palya(Mezo[][] m){ this.m = m; } // 新增受保护的无参构造,仅允许派生类使用 protected Palya() {} }
修改后的派生类:
public class PalyaTeszt extends Palya{ public PalyaTeszt(Mezo[][] m) { super(); // 先调用无参构造,这是第一条语句 // 现在可以正常声明变量并初始化数组了 Mezo[][] testGrid = new Mezo[4][6]; testGrid[0] = new Mezo[]{new Szikla(), new Szikla(), new Viz(), new Szikla(), new Szikla(), new Preri(true)}; testGrid[1] = new Mezo[]{new Szikla(), new Szikla(), new Preri(false), new Preri(false), new Preri(false), new Szikla()}; // ... 补全其他行的初始化 this.m = testGrid; // 给基类的成员变量赋值 } }
注意:这个方案要求基类的m变量不能是final的,如果基类原本把m定义为final Mezo[][] m,那这个方法就不适用了。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

