Вызов глобального массива - PullRequest
1 голос
/ 17 мая 2009

В настоящее время я пытаюсь рисовать фигуры с помощью 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 ]

2 голосов
/ 17 мая 2009

Ваша проблема в том, что 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 и могут иметь различное содержимое.

2 голосов
/ 17 мая 2009

У вас есть несовместимость между статическими методами и переменными экземпляра.

Подумайте об этом так: переменная экземпляра связана с конкретным экземпляром класса; статическая переменная связана с самим классом . Вы вызываете статические методы через класс:

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

Это, очевидно, не однозначное соотношение с вашим заданием, но я уверен, что вы сможете адаптировать его к тому, что вы делаете: -)

1 голос
/ 17 мая 2009

Я не уверен, правильно ли я понял ваш вопрос,

Но похоже, что вам нужен шаблон Singleton, вместо того, чтобы объявлять char canvas[][] как открытое поле, инкапсулируйте массив canvas как свойство только для чтения

public class MyDrawing 
{

private char canvas[][] = null;

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

При использовании getCanvas() в других частях вашего кода, когда вам нужен массив canvas вместо ранее использовавшейся публичной переменной canvas.

0 голосов
/ 17 мая 2009

Кинда запуталась в том, что ты просишь.

Вы всегда можете переопределить глобальный массив в любой точке и использовать его для своих собственных нужд ... но это кажется довольно подозрительным (имеется в виду ... почему это будет глобальный массив).

Кажется, ваш холст не должен меняться в размерах ... но, опять же, я не очень разбираюсь в ваших обстоятельствах.

Проверьте, не равен ли массив массиву, если это так, объявите его нужным вам размером и используйте его с радостью?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...