Java中的重叠对象

时间:2013-11-27 03:55:40

标签: java class instance overlapping

我创建了我的类播放器的2个实例,但似乎创建的最后一个实例总是接管(重叠?)所有其他对象,这里有什么问题?

以下是该计划:

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;
  }
}

我试图寻找其他类似的问题,但我发现的每一个问题对我来说都非常复杂。

4 个答案:

答案 0 :(得分:1)

Player类中的属性(例如namescoredice等被定义为类变量(static)而不是实例变量(非静态)。类/静态变量由所有对象共享,因此您可以看到该行为。尝试更改此内容:

  public static String name;

  public String name;

明智地决定你需要声明为类变量和什么作为成员变量。在此处了解有关实例和类成员的更多信息:

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

答案 1 :(得分:1)

这是因为namestatic课程中的Player字段。 static字段由类的所有实例共享。因此,您需要将name作为实例变量,以便每个实例都有自己的副本。

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

我猜测同样需要为score做同样的事情。

public int score;

答案 2 :(得分:0)

  

public static String name;

应该是

  

public String name;

甚至更好

  

私人字符串名称;

答案 3 :(得分:0)

因为,您的字段为static

  public static String name;

要使用对象更改name,请将其设为实例(非静态)

  public String name;