Tôi biết rằng các nhà xây dựng đối tượng Java ngầm khởi tạo các trường không tĩnh của cá thể của chúng. Tuy nhiên, tôi không chắc chắn về thứ tự mà điều này xảy ra trong một hệ thống phân cấp lớp. Ví dụ:Java Constructor và Field Initialization Order
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));
}
}
constructor của cha mẹ gọi một phương thức trong lớp trẻ, mà ném một ngoại lệ như giá trị của List<Shape> bag
hiện null.
Tôi có thể định nghĩa hàm khởi tạo con và gọi super(), nhưng đó phải là dòng đầu tiên trong phần thân hàm tạo (có nghĩa là tôi vẫn không có cơ hội khởi tạo túi trước khi gọi getNextPiece
).
Tôi thiếu điều gì đó hiển nhiên.