我创建了我的类播放器的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;
}
}
我试图寻找其他类似的问题,但我发现的每一个问题对我来说都非常复杂。
答案 0 :(得分:1)
Player
类中的属性(例如name
,score
,dice
等被定义为类变量(static
)而不是实例变量(非静态)。类/静态变量由所有对象共享,因此您可以看到该行为。尝试更改此内容:
public static String name;
到
public String name;
明智地决定你需要声明为类变量和什么作为成员变量。在此处了解有关实例和类成员的更多信息:
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
答案 1 :(得分:1)
这是因为name
是static
课程中的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;