Java中的对象和ArrayLists

Pen*_*mer 1 java arraylist object

对于我正在进行的任务,我想要做一个疯狂的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];
        }



    }
Run Code Online (Sandbox Code Playgroud)

我的甲板课程:

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

}
Run Code Online (Sandbox Code Playgroud)

Sud*_*hul 5

这是因为这两个facesuitstatic.类的所有static字段都由它的所有实例共享.这就是为什么Card()您在值中创建的每一个都被覆盖,并且您最终得到的最后一个值KC反映了所有实例.您需要将它们设为实例变量,而不是静态变量.

// In Card class
int face; // Instance variable
int suit; // Instance variable
Run Code Online (Sandbox Code Playgroud)

这样,每个实例都Card将自己的单独副本facesuit.

作为旁注,由于deck您的Deck类中的列表也是static,它将显示相同的行为.此外,由于它是静态的,您需要访问的是使用ClassName而不是实例.像这样的东西

for(Card card : Deck.deck){ // access using class name instead of instance
Run Code Online (Sandbox Code Playgroud)