Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否更改对象变量而不更改以前的实例?_Java_List_Object - Fatal编程技术网

Java 是否更改对象变量而不更改以前的实例?

Java 是否更改对象变量而不更改以前的实例?,java,list,object,Java,List,Object,我正在编写一套卡片程序,我正在试验一个包含3个变量的card对象:rank、value和suit 我制作了一个卡片对象,并给它3颗红心的值。(suit=Hearts,Rank=3,value=3)。并将其添加到名为卡的列表中 然后我将上一张卡片对象的值更改为4个红心。(suit=Hearts,Rank=4,value=4),并将其添加到卡列表中 但是,当我打印deck[0]、(3个红心)和deck[1](4个红心)的值时,我的输出是: [红心,四,四] [Hearts,Four,4] 我理解为什

我正在编写一套卡片程序,我正在试验一个包含3个变量的
card
对象:
rank
value
suit

我制作了一个卡片对象,并给它3颗红心的值。(
suit=Hearts,Rank=3,value=3
)。并将其添加到名为
卡的列表中

然后我将上一张卡片对象的值更改为4个红心。(
suit=Hearts,Rank=4,value=4),并将其添加到
卡列表中

但是,当我打印
deck[0]、
(3个红心)和
deck[1]
(4个红心)的值时,我的输出是:
[红心,四,四]
[Hearts,Four,4]

我理解为什么会发生这种情况,我正在更改我放在列表中的对象,并且相应地更新值

有没有一种方法可以让我在列表中放置的对象与我正在更改的对象“断开”连接?我真的不想为所有的牌制作52个对象

我的代码:

卡片对象:

类卡
{
私服;
私有静态字符串秩;
私有静态int值;
公共卡(){
}
公共卡(字符串s、字符串r、整数v){
西服=s;
秩=r;
值=v;
}
公共静态void集合值(字符串s、字符串r、int v){
西服=s;
秩=r;
值=v;
}
公共静态无效toString(卡片){
System.out.println(“[”+card.suit+”、“+card.rank+”、“+card.value+”)”;
}
}
主代码:

公共无效测试(){
卡片=新卡片(“红心”,“三”,3);//制作红心3张
卡[0]=卡;//分配给卡中的插槽0
Card.setValues(“Hearts”,“Four”,4);//将值更改为4个Hearts
卡[1]=卡;//分配给卡中的插槽1
Card.toString(cards[0]);
卡.toString(卡[1]);
}
}

快速编辑:将“Card.setValues”更改为“Card.setValues”没有多大作用,但我想我应该让yall知道

我想你误解了这里的一些基本概念

如果在属性成为类属性时声明该属性,这意味着该属性对于类型卡的所有对象都是可访问的,并且对于这些对象始终保持相同的值。 相反,如果删除“静态”修改器,则该值对于对象的每个实例都是唯一的。 同样的概念也适用于静态方法

如果你重复使用同一张牌的实例(就像你打算做的那样),你总是会改变数组中所有牌的值,因为基本上你只是多次添加同一张牌,然后改变它的值。这是因为分配
卡片[1]=卡片创建指向卡对象的链接,而不是其副本

因此,没有办法为每张卡创建一个对象


您可能应该观看一些关于Java中OOP(面向对象编程)的教程。

是的,您需要创建52个对象。这就是集合的用途。当你将某个东西放入数组时,它不是副本,而是“真实的东西”。因此,在您的代码中,在
[0]
[1]
处有相同的对象。也许您可以使您的卡对象不可变。这样,您就不能更改列表中一个的值。在您的卡类中,使类变量不是静态的。在测试方法中,将调用从setValues方法更改为card=newcard(“Hearts”,“Four”,4);