当我创建一个对象数组时,当我改变其中一个对象的属性时,它们全部都会改变。

3

我有一个名为Hero的类:

public class Hero {
public static int x;
public static int y;

Hero() {
    x=0;
    y=0;
}

Hero(int x, int y) {
    this.x = x;
    this.y = y;
}

public Hero(Hero h) {
    this(h.x, h.y);
}

我制作了一个英雄数组。然而,当我改变hero [0]时,hero [1]和其他所有英雄也会改变。另外,当我制作另一个英雄时,就像这样:

Hero guy = new Hero();

并将他的x更改为如下:

guy.x = 4;

突然之间,我创建的所有英雄对象都有一个 x 值为 4。

在同一项目中还有另一个示例:

import javax.swing.JMenuItem;
public class bonusItem extends JMenuItem{
public static int X;
public static int Y;

bonusItem(String s, int x, int y) {
    super(s);
    X=x;
    Y=y;
}

public void setCols(int cols) {
    X = cols;
}

public void setRows(int rows) {
    Y = rows;
}

public int getCols() {
    return X;
}

public int getRows() {
    return Y;
}

如果我这么做(当然是在创建数组之后):
    bonus[1].setRows(9);
    bonus[1].setCols(9);
    bonus[0].setRows(8);
    bonus[0].setCols(8);

    for(int i=0; i<bonusCount; i++) 
                System.out.println("Bonus " + i + " has " + 
                    bonus[i].getRows() + " rows and "
                         + bonus[i].getCols() + " columns.");

输出结果如下: Bonus 0有8行8列。 Bonus 1有8行8列。
我真的只想要一个离散对象数组,而不是这里发生的任何事情。如果能提供帮助,将不胜感激。谢谢!

它正在按照你告诉它的方式执行。你需要了解static的含义。 - SLaks
2
进一步解释Hanky Panky的答案,static的目的是产生您观察到的确切行为 - 有时,这正是您想要的! - kevinsa5
知道这个很好,谢谢! - PoisonRain
1个回答

6
这个问题是对 "静态" 现象的一个经典解释。
public static int x;
public static int y;

如果使用 static,你如何期望不同的对象具有不同的值呢?

static 成员是针对类本身的,它们与任何单个对象都没有关联。因此,即使你有数百个对象,static 也将保持相同的值。

引用自文档

有时,您需要拥有所有对象共享的变量。这可以通过使用 static 修饰符来实现。在其声明中具有 static 修饰符的字段称为静态字段或类变量。它们与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类的实例的情况下操作类变量。

您应该像这样声明它们

private int x; // or public like you did
private int y;

谢谢!我一直在追寻那个东西。 - PoisonRain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接