我有两个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
?
答案 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中读取。
您需要做的是: