2015-09-25 69 views
0

我有两个棋类的类,一个抽象父类Piece及其正常子类Rook继承的getter返回null

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

+3

因为你不能覆盖变量,你可以隐藏它们。 'Piece'类范围内的'getName'方法对'Rock'类中的变量'name'没有任何线索。因为你从来没有在'Piece'中设置'name',所以你得到的是空值。 – SomeJavaGuy

+0

在'Piece'中添加'protected'' setName'方法,从'Rook'中删除名称字段,也许还会添加一个'Piece'构造函数,让您直接设置名称(和颜色)。也作为一般提示:要么使用Piece的子类,要么使用枚举,而是使用两者,并且具有1对1的关系是没有意义的。 – hoijui

回答

0

这是因为你有效有两个字段鲁克被称为“名” - 一个从Piece继承而来,另一个直接在Rook中(他们都是私有的,所以没有名称冲突,因为你无法从Rook中看到Piece.name)。在Rook构造函数中,您将分配给Rook.name,但在getName()中您正在从Piece.name中读取。

你需要做的是:

  • 从鲁克
  • 删除“名称”字段
  • 添加“名称名称”参数拼凑构造
  • 修改鲁克构造函数调用super(颜色,名称。 ROOK)
+0

我应该从Rook中删除'color'字段吗?这是没用的,因为我正在使用'Piece'中的那个。 – onepiece

+0

是的,'颜色'也应该删除。 –

4

你有两个字段叫做name:子类中的一个是隐藏父抽象类中的一个。 Rook的构造函数初始化Rookname。但是,继承的getName()Piece中返回值name。如果删除子类中的一个,它会打印一个非空值(你将不得不修改器更改为protected不过):

public abstract class Piece { 
    ... 

    protected Name name; 
    protected Color color; 

    ... 
}