在创建一个对象数组时,当我改变一个对象的属性时,它们都会改变

Poi*_*ain 3 java arrays swing

所以我有一个名为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);
}
Run Code Online (Sandbox Code Playgroud)

}

我制作了一系列英雄.但是,当我改变英雄[0]时,英雄[1]和所有其他人也会改变.另外,当我制作另一个英雄时,像这样:

Hero guy = new Hero();
Run Code Online (Sandbox Code Playgroud)

并改变他的x像这样:

guy.x = 4;
Run Code Online (Sandbox Code Playgroud)

突然我创建的所有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;
}
Run Code Online (Sandbox Code Playgroud)

}

如果我这样做(当然是在制作阵列之后):

    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.");
Run Code Online (Sandbox Code Playgroud)

输出为:Bonus 0有8行8列.奖金1有8行8列.

我真的只想拥有一系列离散对象,而不是这里发生的任何事情.任何帮助,将不胜感激.谢谢!

Han*_*nky 6

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

public static int x;
public static int y;
Run Code Online (Sandbox Code Playgroud)

使用static您如何期望您可以为不同的对象设置不同的值?

static成员是针对类本身的,它们不依赖于任何单个对象.因此,static 即使您有数百个对象,a 也将保持相同的值.

来自文档

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

你应该宣称他们是这样的

private int x; // or public like you did
private int y;
Run Code Online (Sandbox Code Playgroud)