1

我目前正在尝试使用 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

4 回答 4

2

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

这样想:实例变量与类的特定实例相关联;静态变量与本身相关联。您通过类​​调用静态方法:

ClassI.callStaticMethod();

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

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

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

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

这是一个例子:

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;
    }
}

这显然不是与您的作业一对一的关联,但我相信您将能够使其适应您正在做的事情:-)

于 2009-05-17T02:25:55.263 回答
2

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

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

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

a并且b是类的实例,DrawingSystem这意味着它们每个都有自己的canvas数组。现在因为makeNewCanvas是静态的并且对于它不能使用的所有实例必须表现相同,a.canvas或者b.canvas因为它们是唯一的a并且b可以具有不同的内容。

于 2009-05-17T03:37:11.600 回答
1

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

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

public class MyDrawing 
{

private char canvas[][] = null;

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

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

于 2009-05-17T02:23:49.340 回答
0

有点困惑你的要求。

您可以随时重新声明全局数组,并将其用于您自己的需要......但这似乎相当可疑(意思是......为什么这是一个全局数组)。

看起来你的画布不应该改变大小......但是再一次,我对你的情况不太了解。

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

于 2009-05-17T01:27:41.567 回答