我知道Java对象构造函数会隐式地初始化其实例的非静态字段。但是,我不确定在类层次结构中这发生的顺序。例如:
abstract public class AbstractPieceSequence implements PieceSequence
{
private Tetromino current;
private Tetromino preview;
public AbstractPieceSequence()
{
advance();
}
@Override
public final void advance()
{
if (preview == null) {
current = getNextPiece();
preview = getNextPiece();
} else {
current = preview;
preview = getNextPiece();
}
}
abstract protected Tetromino getNextPiece();
}
public class ShufflePieceSequence extends AbstractPieceSequence
{
private List<Shape> bag = new LinkedList<Shape>();
@Override
protected Tetromino getNextPiece()
{
if (bag.size() == 0) {
Collections.addAll(bag, Shape.I, Shape.J, Shape.L, Shape.O, Shape.S, Shape.T, Shape.Z);
}
return Tetromino.tetrominoes.get(bag.remove(0));
}
}
父类的构造函数调用了子类中的一个方法,但由于 List<Shape> bag
的值目前为 null,该方法会抛出异常。
我可以定义一个子类构造函数并调用 super(),但这必须是构造函数体中的第一行(这意味着在调用 getNextPiece
之前我仍然没有机会初始化 bag)。
我似乎漏掉了某些明显的东西。