2015-04-07 60 views
0

Java新手。訪問Java中的組合對象

我在下面有一個Player類的實例player1。

Player player1 = new Player(0,0); 

Player類內部我組成了Coord類型的對象座標(定義如下)。當我在上面實例化player1時,「Player is at coordinate 0,0」按預期顯示。

public class Player extends Entity { 
    public Coord coordinate; 
    public Player(int x, int y) { 
     Coord coordinate = new Coord(x,y); 
     System.out.println(「Player is at coordinate 「 + coordinate.getX() + 「,」 
     + coordinate.getY()); 
    } 
} 

Coord類定義如下。

public class Coord { 
    private int x; 
    private int y; 

    public Coord(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 
} 

問題出現在我實例化player1後嘗試訪問obj及其各自的方法。當我嘗試訪問座標時,我得到一個NullPointerException錯誤。

Player player1 = new Player(0,0); 

System.out.println(「Player is at coordinate 「 + player1.coordinate.getX() + 
「,」 + player1.coordinate.getY()); 

我在做什麼錯?

+1

OBJ只存在於你的構造函數的範圍內。在課堂上宣佈。 – csmckelvey

+0

我有obj定義爲我的Player類中的公共字段。我仍然遇到同樣的錯誤。 –

回答

1

您不會讓Coord obj;成爲您班級的一個領域。這可能是因爲像

public class Player extends Entity { 
    Coord obj; 
    public Player(int x, int y) { 
     obj = new Coord(x,y); 
     System.out.println(「Player is at coordinate 「 + obj.getX() + 「,」 
     + obj.getY()); 
    } 
} 

注意簡單說obj是一個可怕的字段名,並且在這裏擁有默認級別訪問權限。改善可能是這樣的

public class Player extends Entity { 
    private Coord coordinates; 
    public Player(int x, int y) { 
     coordinates = new Coord(x,y); 
     System.out.println(「Player is at coordinate 「 + obj.getX() + 「,」 
     + obj.getY()); 
    } 
    public Coord getCoordinates() { 
     return coordinates; 
    } 
} 

然後,你可以使用它像

Player player1 = new Player(0,0); 

System.out.println(「Player is at coordinate 「 
    + player1.getCoordinates().getX() 
    + 「,」 + player1.getCoordinates().getY()); 

您也可能會在Coord類中重寫toString()的一種方式,那麼你可以說

System.out.println(「Player is at coordinate 「 
    + player1.getCoordinates()); 
+0

我沒有提到obj被定義爲我班的一個字段。如果obj被定義爲超類中的一個字段,它會影響嗎?另外,我僅僅使用obj來簡化在這裏發佈。 –

+0

@RaymondRackiewicz發佈**展示問題的真實**代碼。根據你告訴我們的,你是[遮蔽變量](http://en.wikipedia.org/wiki/Variable_shadowing)。 –

+0

如果它是超類中的__private__ –