继承的getter返回null

时间:2015-09-25 11:13:30

标签: java abstract-class

我有两个Chess类,一个抽象父类Piece及其普通子类Rook

public abstract class Piece {
    public enum Color {
        BLACK, WHITE;
    }

    public enum Name {
        KING, ROOK, BISHOP, QUEEN, KNIGHT, PAWN,
        FERZ, WAZIR
    }

    private Name name;
    private Color color;

    public Piece(Color color) {
        this.color = color;
    }

    public Name getName() {
        return this.name;
    }

-

public class Rook extends Piece {
    private Name name;
    private Color color;

    public Rook(Color color) {
        super(color);
        this.name = Name.ROOK;
    }
}

然后我在另一个班级中使用Rook

new Rook(Piece.Color.BLACK).getName() //null
new Rook(Piece.Color.BLACK).getColor() //BLACK

为什么getName()会返回null

2 个答案:

答案 0 :(得分:4)

您有两个名为name的字段:子类中的一个字段隐藏父抽象类中的字段。 Rook的构造函数初始化name的{​​{1}}。但是,继承的Rook会在getName()中返回name的值。如果删除子类中的那个,它将打印一个非空值(您必须将修饰符更改为Piece):

protected

答案 1 :(得分:0)

这是因为你在Rook中实际上有两个字段叫" name" - 一个继承自Piece和一个直接在Rook(他们都是私人所以没有名称冲突,因为你不能看到来自Rook的Piece.name)。在Rook构造函数中,您将分配给Rook.name,但在getName()中,您正在从Piece.name中读取。

您需要做的是:

  • 删除"姓名"来自Rook的字段
  • 添加"姓名"参数到Piece构造函数
  • 修改Rook构造函数以调用super(color,Name.ROOK)