继承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
的构造函数初始化 Rook
的 name
。但是,继承了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)
我有两个 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
的构造函数初始化 Rook
的 name
。但是,继承了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)