Java 整个ArrayList包含相同的对象,尽管创建并添加了单独的元素。。。? 我只想在这篇文章的开头说,我已经做了我的研究,在这里和其他网站上都找到了许多关于这个问题的文章 例子包括:

Java 整个ArrayList包含相同的对象,尽管创建并添加了单独的元素。。。? 我只想在这篇文章的开头说,我已经做了我的研究,在这里和其他网站上都找到了许多关于这个问题的文章 例子包括:,java,for-loop,arraylist,reference,iteration,Java,For Loop,Arraylist,Reference,Iteration,这些帮助我确定了我的问题,但在每个线程上都没有太多关于如何绕过它或解决它的内容。我想这是可能的。 总之,简而言之,我正在利用两个类创建一套卡片程序 “卡”表示牌组中的一张卡 代表52张牌对象容器的“牌组”-稍后将包含洗牌、发牌等方法。 使用下面的代码,我正在设置一个Deck对象&实例化一个ArrayList,我正在使用两层for循环填充Card对象。如果我在迭代时执行Sysout,它会说明对象是用正确的值创建的,但是在循环结束时,调用ArrayList上的Card-toString方法会显示52

这些帮助我确定了我的问题,但在每个线程上都没有太多关于如何绕过它或解决它的内容。我想这是可能的。 总之,简而言之,我正在利用两个类创建一套卡片程序

“卡”表示牌组中的一张卡 代表52张牌对象容器的“牌组”-稍后将包含洗牌、发牌等方法。 使用下面的代码,我正在设置一个Deck对象&实例化一个ArrayList,我正在使用两层for循环填充Card对象。如果我在迭代时执行Sysout,它会说明对象是用正确的值创建的,但是在循环结束时,调用ArrayList上的Card-toString方法会显示52个Ace of Clubs对象,这是最后一张要创建的卡。显然,它不是创建52个单独的卡片对象,而是52次引用同一个卡片对象&因为上一次变量被更改为俱乐部王牌时,看起来好像有52个

我不明白当我在我的卡片组构造函数中显式创建一个新的卡片对象时,它们怎么可能都是同一个对象。如果您能帮助我进行重构,在我的Arraylist中实现52个不同的对象,每个对象都正确填充了它们各自的等级/套装,我们将不胜感激

为了清晰起见,我将我的程序精简为导致此问题的基本代码

提前欢呼

import java.util.ArrayList;



public class Deck {
        ArrayList<Card> mainDeck;

    public Deck(){
    mainDeck = new ArrayList<>();
    for(int x = 1;x<=4;x++){
        for(int y = 2;y<=14;y++){
            mainDeck.add(new Card(y, x));
        }
    }   
}

public void listCards(){
    System.out.println(mainDeck.toString());

    }

/** I have also tried the below method, which also fails!
 * 
 *  public Deck(){
    mainDeck = new ArrayList<>();
    for(int x = 1;x<=4;x++){
        for(int y = 2;y<=14;y++){
        Card card = new Card(y, x);
        mainDeck.add(card);
        }
    }   
}
 * 
 *
 */

 }



public class Card {
    public static int rank;
    public static int suit;
    public static String rankText;
    public static String suitText;

public Card(){

}

public Card(int newRank, int newSuit){
    rank = newRank;
    suit = newSuit;
    switch(newSuit){
    case 1:
        suitText = "Spades";
    break;
    case 2:
        suitText = "Hearts";
    break;
    case 3:
        suitText = "Diamonds";
    break;
    case 4:
        suitText = "Clubs";
    break;
    default:
    break;
    }
    switch(newRank){
    case 2:
        rankText = "Two";
    break;
    case 3:
        rankText = "Three";
    break;
    case 4:
        rankText = "Four";
    break;
    case 5:
        rankText = "Five";
    break;
    case 6:
        rankText = "Six";
    break;
    case 7:
        rankText = "Seven";
    break;
    case 8:
        rankText = "Eight";
    break;
    case 9:
        rankText = "Nine";
    break;
    case 10:
        rankText = "Ten";
    break;
    case 11:
        rankText = "Jack";
    break;
    case 12:
        rankText = "Queen";
    break;
    case 13:
        rankText = "King";
    break;
    case 14:
        rankText = "Ace";
    break;
    }
}
public static int getRank() {
    return rank;
}
public static int getSuit() {
    return suit;
}
public static String getRankText() {
    return rankText;
}
public static String getSuitText() {
    return suitText;
}
@Override
public String toString() {
    return "Card: = "+ getRankText() + " of "+ getSuitText() + "\n";
}





}



public class App 
    {
    public static void main( String[] args )
    {
        Deck thisDeck = new Deck();
        thisDeck.listCards();
    }
}

您的问题是您的卡字段是静态的。删除static关键字,它应该可以工作

卡类中存在问题。所有变量都定义为静态变量,这意味着这些变量与所有卡类对象共享。这就是为什么所有卡显示为相同值的原因

public class Card {
   public static int rank;
    public static int suit;
    public static String rankText;
    public static String suitText;
你必须改变这些非静态变量

public class Card {
   public  int rank;
    public  int suit;
    public  String rankText;
    public  String suitText;

我刚刚发现了。没想到我把它们创建成了静态的。这是一个漫长的夜晚我将删除该帖子。谢谢