【问题标题】:When making an array of objects, when I alter the properties of one, they all change当制作一组对象时,当我改变一个对象的属性时,它们都会改变
【发布时间】:2013-12-09 15:41:15
【问题描述】:

所以我有一个类,叫英雄:

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;

突然间,我创建的所有 Hero 对象的 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 的含义。
  • 为了扩展 Hanky Panky 的答案,static 的重点是产生您观察到的确切行为 - 有时,这正是您想要的!
  • 很高兴知道,谢谢!

标签: java arrays swing


【解决方案1】:

这个问题是对static现象的经典解释。

public static int x;
public static int y;

使用static,你怎么能期望你可以为不同的对象有不同的值?

static 成员用于类本身,它们不绑定到任何单个对象。因此static 即使您有数百个对象,也会保持相同的值。

来自Documentation

有时,您希望拥有所有对象共有的变量。 这是通过静态修饰符完成的。具有 声明中的静态修饰符称为静态字段或类 变量。它们与类相关联,而不是与任何 目的。类的每个实例共享一个类变量,即 在内存中的一个固定位置。任何对象都可以改变 a 的值 类变量,但类变量也可以在没有 创建类的实例。

你应该像这样声明它们

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

【讨论】:

  • 谢谢!我一直在追求它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2011-04-03
相关资源
最近更新 更多