继承getterreturns空

Inherited getter returns null

我有两个 class 国际象棋,一个抽象的父 class Piece 和它的普通子 class 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;
    }
}

然后我在另一个class中使用Rook:

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

为什么 getName() return null?

您有两个名为 name 的字段:子class 中的一个隐藏 父摘要class 中的一个。 Rook 的构造函数初始化 Rookname。但是,继承了getName()returnsname的值Piece。如果您删除子 class 中的那个,它将打印一个非空值(但是您必须将修饰符更改为 protected):

public abstract class Piece {
   ...

   protected Name name;
   protected Color color;

   ...
}

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

您需要做的是:

  • 从 Rook 中删除 "name" 字段
  • 向 Piece 构造函数添加 "Name name" 参数
  • 修改 Rook 构造函数以调用 super(color, Name.ROOK)