2013-11-27 48 views
0

我創建了我的類播放器的2個實例,但似乎創建的最後一個實例總是接管(重疊?)所有其他對象,這裏有什麼問題? (我是初學者,當談到編程)Java中的重疊對象

下面是程序:

public class Test 
{ 
    public static void main (String[] args) 
    { 
    Player player1 = new Player("Player 1"); 
    Player player2 = new Player("Player 2"); 
    Player player3 = new Player("Player 3"); 

    System.out.println(player1.getName()); 
    } 
} 

這是輸出

Player 3 

這是類

import java.util.Scanner; 
import java.util.Random; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class Player 
{ 
    public static String name; 
    public static int score; 
    public static Die[] dice = new Die[5]; 
    public static JRadioButton[] rerollButton = new JRadioButton[5]; 

//---------------------------------------------------------------- 
// Constructor - initialize values 
//---------------------------------------------------------------- 
    public Player(String n) 
    { 
    name = n; 
    score = 0; 

    // initialize all dice and rerollButtons in their respective arrays 
    for (int i = 0; i < 5; i++) { 
     dice[i] = new Die(); 
     rerollButton[i] = new JRadioButton(); 
    } 
    } 

    public String getName() 
    { 
    return name; 
    } 
} 

我試圖尋找其他類似的問題,但我發現每一個問題都很複雜,我真的明白。任何幫助將不勝感激。

回答

1

Player類的屬性,諸如namescoredice等被定義爲類變量(static)代替實例變量(非靜態)。類/靜態變量由所有對象共享,因此您可以看到該行爲。嘗試改變這一點:

public static String name; 

public String name; 

做一個明智的決定,你需要聲明爲類變量,哪些作爲成員變量是什麼。瞭解更多有關實例和類成員在這裏:

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

1

這是因爲name在你Playerstatic場。並且static字段由類的所有實例共享。因此,您需要將name作爲實例變量,以便每個實例都有它自己的副本。

public String name; // Now each instance will have its own copy of name 

而且我猜測score也需要做同樣的事情。

public int score; 
0

公共靜態字符串名稱;

應該

公共字符串名稱;

甚至更​​好

私人字符串名稱;

+0

私人並非越大越好。 – 2013-11-27 04:45:21

+0

但我認爲這可能是在定義了公共getter的情況下 – craiglm

0

因爲,你的領域是static

public static String name; 

要改變name與對象使它作爲實例(非靜態)

public String name;