带继承的java构造函数

时间:2017-12-12 05:32:46

标签: java inheritance constructor

我正在创建一个俄罗斯方块的副本,以练习游戏编程。我在Java中使用OpenGL。

在俄罗斯方块中,正如大多数人所知,当创建TetrisBlock时,它从屏幕的顶部中间开始,每隔一秒左右,向下平移1个单位的Y.当块与底边碰撞时或另一个TetrisBlock,它存储在网格上,并从顶部再次创建一个新块。

我有一个父类(TetrisBlock)和扩展父类的子类(Z-Block,T-Block等)。每个类的必要片段在下面的代码中。对于以下示例,我将重点关注IBlock。

父类:

public abstract class TetrisBlock implements KeyListener {

protected int[] myTranslation;

public TetrisBlock(int[] startingTranslation) {
    myTranslation = startingTranslation;
}

子类:

public class IBlock extends TetrisBlock {

private static final int[] startingTranslation = { 5, -1 } //the top left of my screen is [0,0] so [5,-1] is the translation for I-Block to start in the top middle of the screen

public IBlock() {
    super(startingTranslation);
}

现在,当块向下移动1个单位时,如果它没有碰撞到任何东西,则在同一个类中调用这部分代码。

myTranslation[1]--;

问题在于,当我的主类中再次构造块时,如下所示:

currentBlock = new IBlock();

新的IBlock起点是先前创建和碰撞的IBlock的平移,而不是屏幕的顶部中间。 startingTranslation是静态final,并打印[5,-1],因此不会被更改。但是,当调用新的IBlock时,父类中的myTranslation是先前IBlock的冲突转换。我希望问题在于给出的信息。提前谢谢。

1 个答案:

答案 0 :(得分:0)

不幸的是(对你而言).toggle并不意味着数组的内容无法更改,即它不是只读数组。它只是意味着您无法为其分配新数组。 数组是最终的,它内部的int不是,所以你正在做的是使用对原始数组的引用,当你的块丢弃时它会被更改。

您希望使用例如private static final int[] startingTranslation = { 5, -1 }制作数组的防御副本,因此原始数组不会更改。

clone()