Java继承问题:PremiumSugarSmashPlayer数组长度未达预期(应为50却仅到10)
看起来你在SugarSmash的继承作业里踩了个常见的继承坑——Premium子类的高分数组没能如愿设成50长度,反而继承了父类的10长度对吧?别慌,这大概率是继承时没有正确覆盖父类的数组初始化逻辑导致的,我给你拆解几个最常见的场景和修复方案:
场景1:父类定义了固定长度的数组,子类未重新初始化
咱先假设你的SugarSmashPlayer是这么写的:
public class SugarSmashPlayer { protected int[] highScores = new int[10]; // 父类固定10长度 // 其他游戏相关方法... }
如果PremiumSugarSmashPlayer只是单纯继承,没有重新处理这个数组,那它会直接沿用父类的10长度数组。这时候你只需要在子类里重新初始化数组就行:
public class PremiumSugarSmashPlayer extends SugarSmashPlayer { // 方案一:直接重新定义数组,覆盖父类成员 protected int[] highScores = new int[50]; // 或者方案二:在构造方法里重新赋值 public PremiumSugarSmashPlayer() { highScores = new int[50]; } // 你的Premium专属功能代码... }
⚠️ 注意:如果父类的highScores是private修饰的,子类没法直接访问,这时候你得在父类里加个protected的方法来初始化数组,或者在子类里定义自己的专属数组(不过要避免和父类成员重名导致混淆)。
场景2:父类有初始化数组的方法,子类未重写
要是父类是通过专门的方法来初始化数组的,比如这样:
public class SugarSmashPlayer { protected int[] highScores; public SugarSmashPlayer() { initializeHighScores(); } protected void initializeHighScores() { highScores = new int[10]; } }
那问题就出在子类没重写这个初始化方法!父类构造会调用自己的initializeHighScores(),所以数组还是10长度。你只需要在子类里重写这个方法:
public class PremiumSugarSmashPlayer extends SugarSmashPlayer { @Override protected void initializeHighScores() { highScores = new int[50]; } // 其他Premium代码... }
这样子类实例化时,就会执行自己的初始化逻辑,创建50长度的数组了。
场景3:数组长度用父类常量定义,子类未修改
如果父类用常量来控制数组长度:
public class SugarSmashPlayer { protected static final int MAX_LEVELS = 10; protected int[] highScores = new int[MAX_LEVELS]; }
这时候你需要在子类里重新定义这个常量,再初始化数组:
public class PremiumSugarSmashPlayer extends SugarSmashPlayer { protected static final int MAX_LEVELS = 50; protected int[] highScores = new int[MAX_LEVELS]; }
(注:static final常量是类级别的,子类的常量是独立于父类的,所以不会互相影响)
快速验证方法
你可以在PremiumSugarSmashPlayer里加个小方法来验证数组长度:
public void checkArrayLength() { System.out.println("当前高分数组长度:" + highScores.length); }
然后在DemoSugarSmash里实例化一个Premium对象,调用这个方法,就能确认是不是已经改成50啦。
内容的提问来源于stack exchange,提问作者user9555434

