【问题标题】:Objects and ArrayLists in JavaJava 中的对象和数组列表
【发布时间】:2013-12-19 00:23:31
【问题描述】:

对于我正在处理的任务,我想制作一款疯狂的 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());
        }
    }

}

【问题讨论】:

    标签: java object arraylist


    【解决方案1】:

    这是因为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
    

    【讨论】:

      猜你喜欢
      • 2013-03-15
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2021-04-06
      • 2023-04-07
      • 2021-07-19
      • 1970-01-01
      相关资源
      最近更新 更多