调用全局数组

时间:2009-05-17 01:24:02

标签: java arrays global-variables

我目前正在尝试使用2D阵列绘制形状。在我的班级中,有一个用public char canvas[][];

定义的全局数组

到目前为止,我只使用char canvas[][] = new char[height][width];

声明了数组

如果已经声明了这个数组,并且我不应该修改我已经给出的代码,那么如何调用该数组的实例以便我可以使用它呢?

感谢。

(编辑)

class DrawingSystem {

    public char canvas[][];

       public static void makeNewCanvas(int tmpWidth, int tmpHeight) {

        canvas[][] = new char[tmpHeight][tmpWidth];

        for (int row=0; row<tmpHeight; row++) {
            for (int col=0; col<tmpWidth; col++) {
                canvas[row][col] = ' ';
            }
        }       
    }

4 个答案:

答案 0 :(得分:2)

静态方法和实例变量之间存在不兼容性。

以这种方式思考:实例变量与类的特定实例相关联;静态变量与本身相关联。您可以通过类调用静态方法:

ClassI.callStaticMethod();

而您通过类的实例调用实例方法:

public ClassI classObj = new ClassI();
classObj.callInstanceMethod();

在您发布的代码中,有一个实例变量(“canvas”)在静态方法中设置(main与Class相关联,而不是实例)。

因此,您需要创建实例方法来修改/更新“画布”,并在静态函数中创建类的实例。该对象(“实例”)可用于更新实例变量。

以下是一个例子:

public class Foo {
    public char canvas[][];

    public static void main(String[] args) {
        Foo fooObj = new Foo(); //creates an instance of this class
        fooObj.createCanvas(2, 2);
        fooObj.modifyCanvas(0, 0, 'c');
    }

    public void createCanvas(int x, int y) {
        canvas = new char[x][y];
    }
    public void modifyCanvas(int x, int y, char c) {
        canvas[x][y] = c;
    }
}

这显然与你的任务没有一对一的关联,但我相信你能够使它适应你正在做的事情: - )

答案 1 :(得分:2)

您的问题是makeNewCanvas(int tmpWidth, int tmpHeight)是静态的,或public char canvas[][]不是静态的。

在Java中,静态类成员只能与其他静态类成员一起使用。静态成员属于该类,非静态成员属于实例。该类是用于创建对象的模板,这些对象称为类的实例。当您声明静态时,它将被该类的所有实例共享。对于方法,这意味着静态方法在所有实例上的行为必须完全相同。

DrawingSystem a = new DrawingSystem();
DrawingSystem b = new DrawingSystem();

ab是类DrawingSystem的实例,这意味着它们每个都有自己的canvas数组。既然makeNewCanvas是静态的,并且所有实例的行为必须相同,那么它就不能使用a.canvasb.canvas,因为它们对于ab来说是唯一的不同的内容。

答案 2 :(得分:1)

我不确定我的问题是否正确,

但看起来你需要一个Singleton模式,而不是将char canvas[][]声明为公共字段,将canvas数组封装为只读属性

public class MyDrawing 
{

private char canvas[][] = null;

public char[][] getCanvas()
{
   if (canvas!=null)
   {
      canvas =new char[height][width];
   }
   return canvas;
}

当您需要canvas数组而不是之前使用的canvas公共变量时,在代码的其他部分使用getCanvas()

答案 3 :(得分:0)

有点对你的要求感到困惑。

你总是可以随时重新声明全局数组,并根据自己的需要使用它...但这似乎相当可疑(意思是......为什么这是一个全局数组)。

看起来你的画布不应该改变尺寸......但是,我不太了解你的情况。

检查数组是否为null,如果是,请将其声明为您想要的大小并愉快地使用它?