对于我正在进行的任务,我想要做一个疯狂的8s游戏。我们被要求做的是创建一个创建新卡的类,然后创建一个卡片组,将卡片添加到卡片组中。以下是我的代码。我的问题是,当我尝试在卡片中打印卡片时,它们都显示为“KC”=俱乐部之王。这是我们的第一堂课,所以我希望我只是缺少一些基本的东西。
我的卡类:
public class Card {
static int face;
static int suit;
static String[] faces = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
static String[] suits = {"H", "D", "S", "C"};
public Card(int face, int suit) {
this.face = face;
this.suit = suit;
}
public static String cardString(){
return faces[face - 1] + suits[suit - 1];
}
}
我的甲板课程:
import java.util.List;
import java.util.ArrayList;
public class Deck {
static List<Card> deck = new ArrayList<Card>();
public Deck() {
for (int j = 1; j <= 4; j++){
for (int i = 1; i <= 13; i++){
Card c = new Card(i, j);
// System.out.println(c.cardString());
deck.add(c);
}
}
}
public static void main(String[] args) {
Deck d = new Deck();
for(Card card : d.deck){
System.out.println(card.cardString());
}
}
}
答案 0 :(得分:5)
这是因为face
和suit
都是static
。类的所有static
字段都由它的所有实例共享。这就是为什么您在值中创建的每个Card()
都会被覆盖,并且您最终得到的结果为KC
,反映了所有实例。您需要将它们设为实例变量,而不是静态变量。
// In Card class
int face; // Instance variable
int suit; // Instance variable
这样,Card
的每个实例都会自己单独复制face
和suit
。
作为旁注,由于deck
课程中的Deck
列表也是static
,因此它会显示相同的行为。此外,由于它是静态的,您需要访问的是使用ClassName而不是实例。像这样的东西
for(Card card : Deck.deck){ // access using class name instead of instance