2009-05-17 2 views
1

В настоящее время я пытаюсь рисовать фигуры с помощью 2D-массивов. В моем классе есть глобальный массив не определен с public char canvas[][];Вызов глобального массива

До сих пор я только декларировал массивы с char canvas[][] = new char[height][width];

Если этот массив уже был объявлен, и я не должен изменить код I» Как я могу назвать экземпляр этого массива, чтобы я мог его использовать?

спасибо.

(редактировать)

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] = ' '; 
      } 
     }  
    } 
+0

Можете ли вы опубликовать немного больше кода? Это домашнее задание? Если да, вы бы пометили его как таковой? – bedwyr

+0

Я добавлю базовый код. Как уже упоминалось, я просто пытаюсь вызвать массив canvas в методе MakeNewCanvas. Canvas должен оставаться в виде открытого массива, так как мне нужно будет использовать и редактировать его другими способами в DrawingSystem. –

+0

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

ответ

2

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

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

ClassI.callStaticMethod(); 

В то время как вы вызываете метод экземпляра с помощью экземпляра класса:

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

В коде вы в курсе, что есть переменная экземпляра («холст») будучи установленным в статическом методе (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; 
    } 
} 

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

+0

Спасибо, bedwyr. В приведенном выше примере мой класс ссылается на метод Main в другом классе (мире). Этот код был предоставлен, поэтому все, что я должен сделать, это создать методы в вызываемом классе (ed, methods в DrawingObect) , Но я понял, что это было. До сих пор я работал только в одном классе, поэтому всегда использовал static для определения моих методов, но поскольку класс DrawingSystem не является общедоступным, я не должен включать статичность при определении моих методов. Это правильно? Я удалил статику из имени метода и теперь это соответствует. –

+0

Вы правы. Ключевое слово «static» используется только тогда, когда вы не хотите поддерживать состояние, используя экземпляр класса (например, метод утилиты, который принимает входные данные и предоставляет выход - см. Math.abs). В вашем конкретном случае static не будет работать с переменной экземпляра, с которой вы работаете. Отличная работа! – bedwyr

+0

Удивительный! Еще раз спасибо! –

0

Любопытное запутался о том, что вы просите.

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

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

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

+0

Привет, Спасибо за ответ. Причина, по которой холст является глобальным, заключается в том, что он может быть изменен всеми методами в классе. Первый метод определяет его, второй рисует квадрат в нем, а третий печатает его. Холст Array уже был определен в классе как открытый массив, мне просто не удается вызвать его в методах, как если бы я просто использовал canvas = new char [tmpHeight] [tmpWidth]; внутри метода, я получаю сообщение об ошибке «на статической переменной canvas нельзя ссылаться из статического контекста» при попытке выполнить. –

1

Я не уверен, если я получил свой вопрос прямо,

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

public class MyDrawing 
{ 

private char canvas[][] = null; 

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

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

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

+0

Спасибо Нэш, да, я понял, что случилось, когда белвир отправил свой ответ. Как я уже упоминал выше, я до сих пор работал только в одном классе, так что это первый раз, когда я использовал объекты в Java, поэтому по-прежнему вызывал методы static ... Получил это сейчас! Еще раз спасибо. A –

+0

Нет проблем, и нет ничего плохого в том, чтобы быть чем-то новым! – nash