2015-09-25 83 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; 

    ... 
}